2010-05-07 102 views
3

我正在爲NFL球員的數據庫寫一個搜索功能。如何使用Lucene進行個人姓名(名字,姓氏)搜索?

用戶輸入等「賈森坎貝爾」搜索字符串「坎貝爾」「傑森」

我無法獲得適當的結果。

我應該在索引時使用Analyzer嗎?查詢時哪個Query?我應該區分名字和姓氏還是僅索引全名字符串?

我想以下行爲:

查詢「賈森坎貝爾」 - >結果:1名玩家精確匹配,賈森坎貝爾

查詢「 Campbell「 - >結果:所有以坎貝爾爲名的球員

查詢「傑森」 - >結果:在他們的名字

查詢傑森所有玩家:「康貝爾」 [拼寫錯誤] - >結果:所有球員坎貝爾在他們的名字

+0

你可能做的名字搜索有興趣在我的這篇博客文章:http://www.opensourceconnections.com/2013/08/21/name-search -in-solr/ – 2013-08-21 20:28:18

回答

3

StandardAnalyzer應該適用於上述所有查詢。您的第一個查詢應該用雙引號括起來進行完全匹配,最後一個查詢需要模糊查詢。例如,你可以設置坎貝爾〜0.5,你可以得到坎貝爾匹配(在代字號後面的數字值表示模糊性)。

BTW我會建議使用Solr的它提供了拼寫檢查和功能自動提示,所以你就不必推倒重來。這類似於谷歌的「你的意思是......」

+0

您將使用哪種查詢實現?我需要很長時間才能使TermQuery匹配一個確切的短語。 (您可以通過編程設置FuzzyQuery的模糊性工廠,不需要波浪符號。) – os111 2010-05-07 20:48:16

+0

顧名思義(沒有雙關語意)一個TermQuery是一個學期,你應該看看根據案件的查詢。如果你想匹配「John Smith」*完全匹配*,則使用PhraseQuery。如果你想約翰遜史密斯」當用戶鍵入約翰·史密斯,你應該看看FuzzyQuery – Mikos 2010-05-07 21:53:44

+0

我基本上結束了使用像你的建議。謝謝。 首先嚐試精確匹配使用或者TermQuery或PhraseQuery取決於有多少項是在模糊查詢的查詢。 同樣的方法,因爲它需要單一方面作爲其輸入,所以你需要使用BooleanQuery。 由於建立短語,這有助於。 – os111 2010-05-07 22:13:46