Lucene-Dokumente unterstützen das Hinzufügen von mehreren gleichnamigen Feldern, d.h. man kann sie wiederholt aufrufen:
document.add(new Field("name"), value)
Sie sollten also tun:
# (pseudo-code)
document1.add(new Field("ingredient"), "vanilla")
document1.add(new Field("ingredient"), "strawberry")
index.add(document)
# And then search for
index.search("ingredient", "vanilla" && "strawberry")
Sie erhalten das Dokument1 zurück. Aber wenn Sie suchen nach:
index.search("ingredient", "vanilla" && "apple")
Sie werden nicht zurückkommen Dokument1 .
Wenn Sie gesucht haben:
index.search("ingredient", "vanilla" || "apple")
Sie würden auch zurückbekommen Dokument1 .
Wenn Sie sehen möchten, welche Zutaten übereinstimmen, können Sie die Felder des Dokuments einfach als Gespeicherte Felder und rufen dann für jedes übereinstimmende Dokument die Liste der Felder ab und vergleichen sie mit der Benutzerabfrage.
Beachten Sie auch, dass standardmäßig die PositionIncrementGap für Felder mit demselben Namen, die einem Dokument hinzugefügt werden, ist 0.
Das bedeutet, dass Sie, wenn Sie hinzufügen:
document1.add(new Field("ingredient"), "chocolate")
document1.add(new Field("ingredient"), "orange")
dann würde es so behandelt werden, als wäre es eine einzelne Zutat namens "Schoko-Orange", die auf passen könnte:
index.search("ingredient", "chocolate orange")
Sie können dies vermeiden, indem Sie einen Wert für PositionIncrementGap > 1 setzen, was zu einem Ergebnis führt:
0 Treffer für:
index.search("ingredient", "chocolate orange")
und 1 Treffer für:
index.search("ingredient", "chocolate" && "orange")