Solr Index vs gespeichert

69

Ich bin ein wenig verwirrt darüber, wie sich der Index und die gespeicherten Attribute der Solr-Felder verhalten.

Zum Beispiel, wenn ich Folgendes in der Schema.xml habe

<field name="test1" type="text" indexed="false"
        stored="false" required="false" />

Wird das Feld test1 nicht im Solr-Dokument gespeichert, auch wenn ich ein Dokument mit diesem Feld erstelle und einen Wert für dieses Feld festlege und das Dokument an Solr festschreibe. Bedeutet das stored=falseAttribut, dass der Wert des Feldes in Solr verloren geht und nicht beibehalten wird?

user1965449
quelle

Antworten:

120

Das ist richtig. Normalerweise möchten Sie, dass Ihr Feld entweder indiziert oder gespeichert wird oder beides. Wenn Sie beide auf false setzen, ist dieses Feld in Ihren Solr-Dokumenten nicht verfügbar (weder zum Suchen noch zum Anzeigen). Siehe Alexandres Antwort für die Sonderfälle, in denen Sie beide auf false setzen möchten.

Wie hier angegeben : indexed=truemacht ein Feld durchsuchbar (und sortierbar und facettierbar). Für zB, wenn Sie ein Feld mit dem Namen haben test1mit indexed=true, dann können Sie suchen es mag q=test1:foo, wo fooder Wert der Sie suchen. Wenn indexed=falsefür Feld test1, gibt diese Abfrage keine Ergebnisse zurück, selbst wenn Sie ein Dokument in Solr mit test1dem Wert 'haben foo.

stored=truebedeutet, dass Sie das Feld bei der Suche abrufen können. Wenn Sie den Wert eines Felds in Ihrer Abfrage explizit abrufen möchten, verwenden Sie den flParameter in Ihrer Abfrage wie fl=test1(Standard fl=*bedeutet, dass alle gespeicherten Felder abgerufen werden). Nur wenn stored=truefür test1, wird der Wert zurückgegeben. Andernfalls wird es nicht zurückgegeben.

arun
quelle
1
Wie kann ich Ihre Antwort favorisieren? :)
Fisher Coder
Ich denke, Sie müssen zum Sortieren und Facettieren nicht indizieren. Sie können docValues ​​= true setzen.
Gibbs
29

Der Hauptpunkt, wenn beide auf false gesetzt sind, besteht darin, dieses bestimmte Feld explizit zu überspringen.

Wenn Sie beispielsweise eine dynamische / Feld-Zuordnung zum Speichern / Indizieren haben und einen bestimmten Namen ignorieren möchten, der sonst unter das Muster von dynamicField fallen würde.

Alternativ können Sie dynamicField verwenden, um eine ganze Reihe von Feldern mit demselben Präfix / Suffix zu ignorieren, das von einem Drittanbieter stammt. Zum Beispiel sendet Tika Ihnen eine ganze Reihe von Metadatenfeldern, die Sie möglicherweise einfach ignorieren möchten. Siehe dies in Solrs Beispiel schema.xml definiert und in solrconfig.xml verwendet

In späteren Versionen von Solr können Sie stattdessen auch IgnoreFieldUpdateProcessorFactory verwenden (siehe vollständige Liste für andere), wodurch diese Felder noch früher im Indizierungsprozess entfernt werden.

Alexandre Rafalovitch
quelle
1
Dieser Anwendungsfall für ein Feld, das sowohl indiziert als auch gespeichert ist, wurde nicht auf false gesetzt.
Arun
4
Wenn Sie Beispielkonfigurationen Zeile für Zeile lesen, lernen Sie viele seltsame und wunderbare Dinge.
Alexandre Rafalovitch
Wenn ich nur den Index und nicht den Feldwert speichere, wirkt sich dies auf die Leistung aus, da ich Feldwerte immer in einer anderen Datenbank speichern und die Daten von dort zurückgeben kann, sobald Solr mir das Suchergebnis gegeben hat. Wird es mir helfen, die Größe der Indexdatei und die bessere Leistung zu reduzieren
viren
1
Die Solr-Dokumentation ermöglicht die direkte Aktualisierung von Feldern, die beide auf false gesetzt sind. Gibt es einen Sinn dafür? Welchen praktischen Sinn hat es, Felder zu aktualisieren, die nicht durchsuchbar und nicht speicherbar sind?
Max Chernopolsky
1
In diesem Beispiel sind docValues ​​aktiviert, in denen Inhalte erneut auf andere Weise gespeichert werden. Und Sie können docValue zurückgeben, auch wenn gespeichert auf false gesetzt ist. Dies ist eine neue Solr-Funktionalität (6+), die bei der Beantwortung der obigen Frage nicht vorhanden war.
Alexandre Rafalovitch
9

Zitat aus dieser Antwort im Mail-Thread des Solr:

"indiziert" und "gespeichert" sind unabhängige, orthogonale Attribute - Sie können eine der vier Kombinationen von wahr und falsch verwenden. "indiziert" wird für die Suche oder Abfrage verwendet, der "Nachschlag" -Teil der Verarbeitung einer Abfrageanforderung. Sobald die Suche / Abfrage / Suche abgeschlossen und eine Reihe von Dokumenten ausgewählt ist, ist "gespeichert" die Reihe von Feldern, deren Werte zur Anzeige oder Rückgabe mit der Solr-Antwort verfügbar sind.

Ein Grund für die Trennung ist, dass Solr / Lucene die Eingabedaten für eine schnellere und relevantere Suche / Suche "analysiert" oder in eine effizientere Form umwandelt. Leider sind diese analysierten / transformierten Daten häufig nicht mehr für die Anzeige und den menschlichen Verzehr geeignet. Mit anderen Worten ist die Analyse / Transformation nicht bidirektional / reversibel. Die Einstellung "gespeichert = wahr" garantiert, dass die Originaldaten in ihrer ursprünglichen Form abgerufen werden können.

Blass-blauer Punkt
quelle
3
"Analysierte / transformierte Daten sind häufig nicht mehr für die Anzeige und den menschlichen Verzehr geeignet ..." Ich habe mich gefragt, warum wir den Feldwert nicht anzeigen können, wenn er auf index = "true", aber gespeichert = "false" gesetzt ist. Du hast es geklärt. Vielen Dank!
AlexMelw
3

Wenn beide falsch sind, verlieren Sie Ihre Daten in diesem Feld. Wenn indiziert true, sind die Daten durchsuchbar, können jedoch nicht angezeigt werden. Wenn Sie "gespeichert" auf "true" setzen, können Sie nicht in diesem Feld suchen, es kann jedoch angezeigt werden (in diesem Fall können Sie eine Kopierfeldregel schreiben, um die Informationen aus diesem Feld in das standardmäßig durchsuchbare Feld zu kopieren). Beide als true gesetzt -> können Sie suchen und anzeigen.

Alik Vardanyan
quelle
Wie unterscheidet sich das von den vorhandenen Antworten?
MatsLindh
0

indexed = true bedeutet, dass dieses Feld bei der Suche verwendet werden kann. Wenn ich beispielsweise das Elementfeld wie folgt einstelle und versuche, das Feld in einer Suche auszuführen

<field name="item" type="text_general" uninvertible="true" indexed="false" stored="true"/>

fq = item: "Tennis" markiert einen Fehler.

gespeichert = wahr bedeutet, dass dieses Feld in der Liste der Felder abgerufen werden kann, die nach einer Abfrage angezeigt werden. Zum Beispiel, wenn das Elementfeld wie folgt definiert ist

<field name="item" type="text_general" uninvertible="true" indexed="true" stored="false"/>

Sie können suchen fq = item: "Tennis" correctly, aber das Elementfeld in den Ergebnissen wird nicht zurückgegeben.

Grüße

Sergio Briano
quelle