2017-07-06 49 views
0

由於我不能控制的原因,我必須通過全局搜索來做到這一點。我已經將搜索字詞「John J」轉換爲(John AND J),它適用於任何姓氏不是以與第一個字母相同的字母開頭的人。我如何搜索lucene for「John J」,並讓像John Jameson這樣的人不僅僅是John的人?

我該如何讓「John J」的搜索變成「找到所有擁有John的人,然後是另一個不同的J在現場」?

謝謝你的時間。

+0

我猜你使用的是NGramTokenFilter什麼?看起來像[詞組查詢](https://lucene.apache.org/core/6_6_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#Terms)可能是你要找的。使用引號。 – femtoRgon

回答

1

您可能想要試用通配符查詢。例如:

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

我假設你有第一個和第二個名稱不同的字段。您可以使用第一個和第二個名稱的查詢組合創建一個布爾查詢。

的文檔WildcardQuery:http://lucene.apache.org/core/6_2_0/core/org/apache/lucene/search/WildcardQuery.html

我希望這有助於。

+0

感謝您的評論。我正在使用lucene構建一個typeahead輸入。所以用戶會輸入「John J」,所以沒有一堆邏輯,我不能簡單地做J *。 –

0

既然你提到它是一個類型提前輸入; prefixQuery可能有所幫助 -

new PrefixQuery(new Term("lastName","J")); 

這將返回姓氏以「J」開頭的所有文檔。

爲了得到結果,其中名字以「約翰」 開始, lastName的「J」開頭,你可以有 -

BooleanQuery.Builder booleanQueryBuilder; 
booleanQueryBuilder.add(new PrefixQuery(new Term("firstName","John"))); 
booleanQueryBuilder.add(new PrefixQuery(new Term("lastName","J")));` 
相關問題