Fehlerbehebung bei Java Lucene, bei dem Field ignoriert wird
Frage
Wir verwenden derzeit Lucene 2.1.0 für unsere Website-Suche und sind auf ein schwieriges Problem gestoßen:Eines unserer Indexfelder wird bei einer gezielten Suche ignoriert.Hier ist der Code zum Hinzufügen des Felds zu einem Dokument in unserem Index:
// Add market_local to index
contactDocument.add(
new Field(
"market_local"
, StringUtils.objectToString(
currClip.get(
"market_local"
)
)
, Field.Store.YES
, Field.Index.UN_TOKENIZED
)
);
Wenn Sie eine Abfrage ( * ) für den Index ausführen, werden die folgenden Ergebnisse zurückgegeben:
Result 1:
title: Foo Bar
market_local: Local
Result 2:
title: Bar Foo
market_local: National
Ausführen einer gezielten Abfrage:
+( market_local:Local )
werde keine Ergebnisse finden.
Mir ist klar, dass dies eine sehr spezifische Frage ist. Da ich ein Lucene-Neuling bin, versuche ich nur Informationen darüber zu erhalten, wo ich mit der Fehlerbehebung dieses Problems beginnen kann.
AKTUALISIEREN
Luke installiert und den neuesten Index überprüft ...das Feld Markt_lokal ist in der Suche verfügbar. Wenn ich also etwas ausführe wie:
market_local:Local
Die Suche funktioniert korrekt (in Lukas).Ich gehe jetzt unseren Analysecode durch. Gibt es eine Möglichkeit, dieses Problem darauf zurückzuführen, dass unsere Suchanwendung Lucene 2.1.0 und die neueste Version von Luke 2.3.0 verwendet?
Lösung
Zum Debuggen ist Lucene das beste Tool Lukas, wodurch Sie im Index selbst herumstöbern können, um zu sehen, was indiziert wurde, Suchvorgänge durchzuführen usw.Ich empfehle, es herunterzuladen, auf Ihren Index zu zeigen und zu sehen, was dort enthalten ist.
Andere Tipps
Der Abschnitt „Warum erhalte ich keine Treffer?“ In den Lucene-FAQ finden Sie einige Vorschläge, die Sie möglicherweise nützlich finden.Sie verwenden Field.Index.UN_TOKENIZED, daher wird kein Analysator für die Indizierung verwendet (glaube ich).Wenn Sie bei der Suche einen Analysator verwenden, könnte dies die Ursache Ihres Problems sein: Die Indexierungs- und Suchanalysatoren sollten identisch sein, um sicherzustellen, dass Sie die richtigen Treffer erhalten.
Eine andere einfache Möglichkeit wäre die Verwendung eines Debuggers oder einer Protokollierungsanweisung, um den Wert von zu überprüfen
StringUtils.objectToString(currClip.get("market_local"))
um sicherzustellen, dass es das ist, was Sie denken.
Luke ist im Lieferumfang von Lucene enthalten, aber Sie können Luke anweisen, eine andere Version von Lucene zu verwenden.Angenommen, „lucene-core-2.1.0.jar“ enthält Lucene 2.1.0, das Sie verwenden möchten, und „luke.jar“ enthält Luke mit Lucene 2.3.0.Dann können Sie Luke mit dem folgenden Befehl starten.
java -classpath lucene-core-2.1.0.jar;luke.jar org.getopt.luke.Luke
(Der Trick besteht darin, Ihre Version von Lucene vor Luke auf dem Klassenpfad zu platzieren.Dies gilt auch für Windows.Auf Unix, ersetzen ";" mit ":".)
Wie Sie Luke einchecken können,
+( market_local:Lokal )
wird umgeschrieben
market_local:Lokal
Wenn die rewrite(IndexReader)-Methode des Query-Objekts wird genannt.Die beiden Abfragen sollten gleichwertig sein, sodass in 2.1 möglicherweise ein Fehler vorliegt.Wenn Sie 2.1 verwenden müssen, können Sie versuchen, diese Methode manuell aufzurufen, bevor Sie das Query-Objekt an den IndexSearcher übergeben.