2012-11-15 101 views
7

如果搜索「bahnhofstrasse」,我希望Lucene找到包含術語「bahnhofstr」的文檔,即,我不要只想查找包含我的搜索字詞作爲前綴的條款的文檔,以及包含本身就是我的搜索字詞前綴的字詞的文檔...在索引中搜索作爲搜索詞的前綴的詞(反之亦然)(!)

我該如何解決這個問題?

+0

相關(但不給你一個合適的回答,只是說:「是的,你可以「):http:// stackoverflow。com/questions/10671755/lucene-prefix-search-for-indexed-data-through-standard-analyser – Thilo

+1

沒有看到反之亦然的部分。所以你也想打「b」?有最小長度嗎? – Thilo

+0

是的,有些情況下我也想打「b」。想象一下只有內容「D」的字段「first_name」... –

回答

0

我認爲模糊查詢可能對您最有幫助。這將根據來自查詢的Levenshtein距離對項進行評分。如果沒有指定最小相似度,它將有效匹配每個可用的術語。這可以使其不足性能,但確實實現了您正在尋找的內容。

模糊查詢由〜字符信號發送,如:

firstname:bahnhofstr~ 

或者與最小相似度(0和1,0之間的一個數是最寬鬆沒有最低)

firstname:bahnhofstr~0.4 

或者如果您正在構建自己的查詢,請使用FuzzyQuery

這不完全是您指定的內容,而是最簡單的方法。

至於你正在尋找什麼,我不知道一個簡單的Lucene調用來完成它。我可能會術語只是分成了一系列termqueries的,你可以在查詢字符串類似表示:

firstname:b 
firstname:ba 
firstname:bah 
firstname:bahn 
firstname:bahnh 
firstname:bahnho 
firstname:bahnhof 
firstname:bahnhofs 
firstname:bahnhofst 
firstname:bahnhofstr* 

我不會真的產生查詢字符串,它自己,順便說一句。我只是自己構造TermQuery和PrefixQuery對象。

評分會有點扭曲,我可能會提高更長時間的查詢以更好地排序,但這是想到的方法,可以非常容易地完成您正在尋找的內容。一個DisjunctionMaxQuery將幫助你使用這樣的事情與其他條款,並獲得更合理的評分。

但願模糊查詢適合您。似乎更好的解決方案。

另一種選擇,如果你有很多需要這種性質的查詢,可能是,當索引記號化領域爲正克(見NGramTokenizer),這樣可以讓你有效地使用NGramPhraseQuery達到的結果你要。

1

如果我理解正確的話,你的搜索字符串是一個確切的字符串,可以在Lucene的設置queryParser.setAllowLeadingWildcard(true);允許領先通配符搜索(這可能會或可能不會慢 - 我已經看到他們相當快,但在一個只有60,000多個Lucene文檔的情況)。

你舉的例子查詢語法可能看起來是這樣的:

*bahnhofstr bahnhofstr* 

或可能(沒有測試)剛:

*bahnhofstr*