2017-07-06 4 views
0

Aus Gründen, die ich nicht kontrollieren kann, muss ich dies mit einer globalen Suche tun. Ich habe einen Suchbegriff "John J" in (John AND J) umgewandelt, der für jeden funktioniert, dessen Nachname nicht mit dem gleichen Buchstaben wie der erste beginnt.Wie kann ich Lucene für "John J" suchen und Leute wie "John Jameson" nicht nur Leute mit John bekommen?

Wie kann ich die Suche nach "John J" werden "finden alle Menschen, die John und dann eine andere, andere J im Feld haben"?

Danke für Ihre Zeit.

+0

Ich vermute, Sie NGramTokenFilter oder etwas verwenden? Sieht aus wie eine [Phrasenabfrage] (https://lucene.apache.org/core/6_6_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#Terms) ist wahrscheinlich, was Sie suchen. Zitate verwenden – femtoRgon

Antwort

1

Sie können die Wildcard-Abfrage ausprobieren. Zum Beispiel:

Term term = new Term("secondName", "J*"); 
Query query = new WildcardQuery(term); 

Ich nehme an, Sie haben eine andere Felder für den ersten und zweiten Namen. Sie können eine boolesche Abfrage mit einer Kombination von Abfragen für den ersten und zweiten Namen erstellen.

Dokumentation für WildcardQuery: http://lucene.apache.org/core/6_2_0/core/org/apache/lucene/search/WildcardQuery.html

Ich hoffe, das hilft.

+0

Vielen Dank für Ihre Kommentare. Ich baue eine Tippeingabe mit Lucene aus. Also hat der Benutzer "John J" eingegeben, also kann ich ohne einen Haufen Logik nicht einfach J * machen. –

0

Da Sie erwähnt haben, ist es eine Art voraus Eingabe; prefixQuery hilft möglicherweise -

Dies wird alle Dokumente mit Nachname beginnend mit "J" zurückgeben.

Ergebnisse zu erhalten, wo vorName beginnt mit „John“ und Nachnamen beginnt mit „J“ können Sie haben -

BooleanQuery.Builder booleanQueryBuilder; 
booleanQueryBuilder.add(new PrefixQuery(new Term("firstName","John"))); 
booleanQueryBuilder.add(new PrefixQuery(new Term("lastName","J")));` 
Verwandte Themen