2008-09-03 11 views
2

Wir verwenden derzeit Lucene 2.1.0 für unsere Website-Suche und wir haben ein schwieriges Problem: eines unserer Indexfelder wird bei einer gezielten Suche ignoriert. Hier ist der Code für das Hinzufügen des Feldes zu einem Dokument in unserem Index:Fehlerbehebung bei Java Lucene Ignorieren von Feld

// Add market_local to index 
contactDocument.add(
    new Field(
     "market_local" 
     , StringUtils.objectToString(
      currClip.get(
       "market_local" 
      ) 
     ) 
     , Field.Store.YES 
     , Field.Index.UN_TOKENIZED 
    ) 
); 

Ausführen einer Abfrage (*) gegenüber dem Index die folgenden Ergebnisse werden zurückgegeben:

Result 1: 
    title: Foo Bar 
    market_local: Local 

Result 2: 
    title: Bar Foo 
    market_local: National 

eine gezielte Abfrage ausgeführt wird:

+(market_local:Local) 

werden keine Ergebnisse finden.

Ich weiß, dass dies eine sehr spezifische Frage ist, ich versuche nur Informationen darüber zu bekommen, wo ich dieses Problem debuggen kann, da ich ein Lucene-Neuling bin.


UPDATE

installierte Luke, neuesten Index Check-out ... das Field market_local bei der Suche zur Verfügung steht, so dass, wenn ich etwas ausführen wie:

market_local:Local 

Die Suche funktioniert richtig (in Lukas). Ich gehe jetzt unseren Analyzer-Code durch. Kann ich dieses Problem auf die Tatsache ansprechen, dass unsere Suchanwendung Lucene 2.1.0 verwendet und die neueste Version von Luke 2.3.0 verwendet?

Antwort

6

Für Lucene Debuggen, das beste Werkzeug zu verwenden ist Luke, die Sie im Index selbst herumzustochern können, um zu sehen, was sucht bekam indiziert, durchführen, usw. Ich kann es empfehlen, das Herunterladen es in Ihrem Index zeigt, und zu sehen, was ist da drin.

+0

Meine Augen bluten ... Luke ist hässlich! (Aber es macht den Trick. Danke. +1) – DerMike

2

Die section on "Why am I getting no hits?" in der Lucene FAQ hat einige Vorschläge, die Sie nützlich finden könnten. Da Sie Field.Index.UN_TOKENIZED verwenden, wird kein Analyzer für die Indizierung verwendet (denke ich). Wenn Sie bei der Suche einen Analyzer verwenden, könnte dies die Wurzel Ihres Problems sein - die Indizierung und die Suche nach Analysatoren sollten gleich sein, um sicherzustellen, dass Sie die richtigen Treffer erhalten.

1

Eine weitere einfache Sache zu tun wäre, einen Debugger oder Logging-Anweisung zu verwenden, um den Wert von

StringUtils.objectToString (currClip.get ("market_local"))

zu überprüfen, um sicher, dass es das ist, was du denkst.

1

Luke ist mit Lucene gebündelt, aber Sie können Luke sagen, dass er eine andere Version von Lucene verwenden soll. Sage "lucene-core-2.1.0.jar" enthält Lucene 2.1.0, das du verwenden willst 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 ist, Ihre Version von Lucene vor Luke auf dem Classpath zu setzen Dies gilt auch für Windows: Ersetzen Sie unter Unix ";" durch ":".

)

Wie Sie in Luke überprüfen,

+ (market_local: Lokal)

neu geschrieben wird zu

market_local: Lokale

wenn the rewrite(IndexReader) method of the Query object wird genannt. Die zwei Abfragen sollten gleichwertig sein, daher könnte es einen Fehler in 2.1 geben. Wenn Sie 2.1 verwenden müssen, können Sie versuchen, diese Methode manuell aufzurufen, bevor Sie das Query-Objekt an den IndexSearcher übergeben.

Verwandte Themen