2009-03-17 4 views
1

Verwenden Sie MultiFieldQueryParser zum Analysieren von Zeichenfolgen wie a.a., b.b. usw. Aber nach dem Parsing entfernt die Punkte in der Zeichenfolge. Was fehlt mir hier?Verwenden von MultiFieldQueryParser

Danke.

+0

Vielleicht, wenn Sie mehr Informationen darüber geben, was Sie versuchen, kann ich Ihnen weiter helfen. – dustyburwell

+0

arbeite an einer Buchsuche api mit Lucene.User kann nach einem Buch suchen, dessen Titel oder Beschreibungsfeld C.F.A enthält ... ist diese Information ausreichend? –

Antwort

1

Welchen Analysator benutzt Ihr Parser? Wenn es StopAnalyzer ist, dann könnte der Punkt ein Stoppwort sein und wird daher ignoriert. Das gleiche gilt, wenn es StandardAnalyzer ist, der die Eingabe bereinigt (einschließlich Entfernen von Punkten).

+0

danke für deine Eingaben ... verwende StandardAnalyzer zusammen mit einer Liste von Stoppwörtern ... meine Liste mit Stoppwörtern hat kein "." drin. –

2

Ich bin mir nicht sicher, ob der MultiFieldQueryParser das tut, was er zu tun glaubt. Auch ... Ich bin mir nicht sicher, ob ich weiß, was du versuchst.

Ich weiß, dass mit jedem Abfrageparser Zeichenfolgen wie 'a.a.' und "b.b." Die Perioden werden ausgeblendet, da zumindest beim Standard-Analyzer alle Interpunktionszeichen als Leerzeichen behandelt werden.

Soweit der MultiFieldQueryParser geht, ist dies nur ein QueryParser, mit dem Sie mehrere Standardfelder für die Suche angeben können. Also mit der Abfrage

Titel: „Von Mäusen und Menschen“ „John Steinbecks“

Die Zeichenfolge „John Steinbeck“ werden während in all Ihre Standardfelder betrachtet werden „Von Mäusen und Menschen "wird nur im Titelfeld gesucht.

1

(Wiederholen meiner Antwort von the dupe. Einer von diesen sollte gelöscht werden).

Die StandardAnalyzer behandelt speziell Akronyme und konvertiert C.F.A. (Zum Beispiel) zu cfa. Dies bedeutet, dass Sie in der Lage sein sollten, die Suche durchzuführen, solange Sie sicherstellen, dass Sie denselben Analysator für die Indizierung und für die Abfrageanalyse verwenden.

Ich würde vorschlagen, dass Sie einige grundlegende Testfälle ausführen, um andere Faktoren zu eliminieren. Versuchen Sie, eine gewöhnliche QueryParser statt einer Multi-Feld Benutzer zu verwenden.

Hier einige Code, den ich mit dem spielen, schrieb StandardAnalyzer:

StringReader testReader = new StringReader("C.F.A. C.F.A word"); 
StandardAnalyzer analyzer = new StandardAnalyzer(); 
TokenStream tokenStream = analyzer.tokenStream("title", testReader); 
System.out.println(tokenStream.next()); 
System.out.println(tokenStream.next()); 
System.out.println(tokenStream.next()); 

Die Ausgabe für diese, übrigens war:

(cfa,0,6,type=<ACRONYM>) 
(c.f.a,7,12,type=<HOST>) 
(word,13,17,type=<ALPHANUM>) 

Hinweis, zum Beispiel, dass, wenn das Akronym doesn‘ Wenn der Punkt mit einem Punkt endet, geht der Analysator davon aus, dass es sich um einen Internet-Host-Namen handelt. Die Suche nach "CFA" stimmt also nicht mit "CFA" überein. im Text.