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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top