Was ist die Verwendung des Feldtyps "multiValued" in Solr?

75

Ich bin neu bei Apache Solr. Selbst nach dem Lesen des Dokumentationsteils fällt es mir schwer, die Funktionalität und Verwendung der multiValuedFeldtyp-Eigenschaft klar zu verstehen .

Was macht / behandelt / behandelt Solr intern ein Feld, das als multiValued markiert ist ?

Was ist der Unterschied bei der Indizierung in Solr zwischen einem Feld mit mehreren Werten und einem Feld ohne Wert ?

Kann jemand mit einem guten Beispiel erklären?

Doc sagt:

multiValued = true | false

True, wenn dieses Feld mehrere Werte pro Dokument enthalten kann, dh wenn es in einem Dokument mehrmals vorkommen kann

Gnanam
quelle

Antworten:

74

Ein mehrwertiges Feld ist nützlich, wenn mehr als ein Wert für das Feld vorhanden ist. Ein einfaches Beispiel wären Tags. Es kann mehrere Tags geben, die indiziert werden müssen. Wenn wir also ein mehrwertiges Tag-Feld haben, gibt die solr-Antwort eine Liste anstelle eines Zeichenfolgenwerts zurück. Ein zu beachtender Punkt ist, dass Sie für jeden Wert der Tags mehrere Zeilen senden müssen, z.

<field name = "tags"> tag1 </ tags>
<field name = "tags"> tag2 </ tags>
...
<field name = "tags"> tagn </ tags>

Sobald Sie alle Werteindex haben, können Sie die Ergebnisse nach einem beliebigen Wert suchen oder filtern, z. Sie können alle Dokumente mit tag1 mit Abfrage wie finden

q=tags:tag1

oder verwenden Sie die Tags, um Ergebnisse wie herauszufiltern

q=query&fq=tags:tag1
Umar
quelle
5
Was ist der Unterschied / Vorteil zwischen dem Tun search or filter results by any value? Welchen Unterschied macht es in diesem Fall bei der Suche mit Tags: tag1 in 'q' oder fq?
Gnanam
1
Jeder Wert kann eine Zeichenfolge sein und Sie können eine genaue Übereinstimmung mit einer Reihe von Zeichenfolgen erzielen. Bei einwertigen Feldern können Sie entweder Wörter mit Token oder eine ganze Zeichenfolge verwenden. Eine andere Verwendung ist das Speichern von Werten, die Listen sind, wie ich im Fall von Tags erwähnt habe. Sie können Zahlen wie eine Liste von numerischen Werten sein.
Umar
6
@Gnanam: Gefilterte Abfragen werden zwischengespeichert und wirken sich nicht auf die Punktzahl aus. Ihr Hauptzweck besteht darin, eine feste "Obermenge" von Dokumenten zu erstellen, die dann durchsucht werden können. Beispiel: Der Benutzer gibt eine Abfrage ein und die Anwendung wendet zusätzliche Einschränkungen an, um beispielsweise nur die Dokumente zu durchsuchen, deren Eigentümer der Benutzer ist. In diesem Fall würde die Anwendung die Einschränkung "nur gegebener Benutzer" als fqund die tatsächliche Suchabfrage als senden q.
Daniel Rikowski
Was ist, wenn Sie die Werte von Tags nicht kennen? Wenn Sie beispielsweise eine Sammlung von Artikeln indizieren, möchten Sie "Schlüsselwort" als MultiValue-Feld festlegen, kennen jedoch nicht alle Werte!
Fanchyna
15

multiValued definiert im Schema, ob das Feld mehr als einen Wert haben darf.

Zum Beispiel:
Wenn ich einen Feldtyp namens ID habe, der multiValued = false ist und ein Dokument wie dieses indiziert:

doc {
  id : [ 1, 2]
  ...
}

Dies würde dazu führen, dass eine Ausnahme im Indizierungsthread ausgelöst wird und das Dokument nicht indiziert wird (die Schemaüberprüfung schlägt fehl).

Wenn ich jedoch mehrere Werte für ein Feld habe, möchte ich multiValued = true setzen, um sicherzustellen, dass die Indizierung korrekt durchgeführt wird, zum Beispiel:

doc {
  id : 1
  keywords: [ hello, world ]
  ...
}

In diesem Fall würden Sie "Schlüsselwörter" als ein Feld mit mehreren Werten definieren.

Asaf
quelle
1
Lassen Sie mich wissen, ob ich das richtig verstanden habe. Wenn ich beispielsweise versuche, Daten direkt aus der Datenbank mit zu indizieren, DataImportHandlerund wenn einer meiner Datenbankfeld- Tag- Typen VARCHAR[](varchar array) ist, ist es sinnvoll, dieses Tag- Feld im Solar-Schema-Feld als multiValued zuzuordnen. Bin ich in meinem Verständnis richtig?
Gnanam
1
spät zum Spiel hier, aber ich würde im Allgemeinen ja sagen ... aber nie nie sagen und nie immer sagen
Markgiaconia
12

Ich verwende mehrere Wertefelder nur mit Kopierfeldern. Denken Sie also so, dass alle Felder einen einzigen Wert haben, es sei denn, es handelt sich um ein Kopierfeld. Ich habe beispielsweise folgende Felder:

<field name="id" type="string" indexed="true" stored="true"/>
<field name="name" type="string" indexed="true" stored="true"/>
<field name="subject" type="string" indexed="true" stored="true"/>
<field name="location" type="string" indexed="true" stored="true"/>

Ich möchte nur ein Feld abfragen und möglicherweise alle 4 Felder oben durchsuchen, dann müssen wir copyfield verwenden. Erstellen Sie zuerst einen neuen Feldaufruf "Alle" und kopieren Sie dann alles in "Alle".

<field name="all" type="text" indexed="true" stored="true" multiValued="true"/>
<copyField source="*" dest="all"/>

Jetzt muss das Feld 'alle' mehrwertig sein.

waynet
quelle