2011-03-09 74 views
2

Lucene不支持開箱即用,所以我需要一些幫助來構建我的查詢。Lucene部分詞匹配

可以說,我有一個字段值的文檔「發展」

我想對於搜索將返回「開發」和「羅布泊」這個文件。

也許創建兩個查詢?

"*keyword" 

"keyword*" 

"keyword" 

你會如何去做這個與多個詞?你會將句子/搜索分成一個單詞列表,併爲每個單詞做前面的例子嗎?

回答

9

你在問什麼,如果我正確理解你不是任何大型搜索引擎的可行。
Lucene使用術語文檔矩陣和倒排文件技術爲關鍵字創建索引(請參閱底部的鏈接)。一個完全成熟的字符串匹配可能是非常好的,但它不能縮放:在可接受的時間內,您將永遠無法查詢大小適中的索引(例如多於幾十個/數百個文檔)。

但是,這裏有兩個想法,可以幫助...

音節切分
回來你的例子與「發展」。只要你對讓用戶搜索音節感到滿意,我想你可以做一些事情。 您將不得不創建使用標記器,根據它們的音節將索引中的單詞分開,並在音節上創建數據庫索引。 (我不確定是否有內置的英語語言標記器可以做到這一點,並自己寫一個可能會很棘手...)

一個重要的事情要注意:
如果你會索引全字而且,如果您僅指定其中的一個,則索引的大小將會比單獨的音節大得多。

但是我不會建議只索引音節。如果你想讓你的用戶搜索完整的單詞'Develop'(我想你想要的),這將導致兩個查詢之間有邏輯,即<'dev'和'lop'>。儘管Lucene在查詢中支持這種邏輯構造,但它們非常昂貴。我在過去在Lucene中使用邏輯查詢時遇到過一些麻煩。

詞幹
另一種方法來在你想可能是使用單詞的殘酷形式所產生(http://en.wikipedia.org/wiki/Stemming)是莖的話他們的第一個音節什麼莫名其妙到達。 (這將允許搜索「開發」,但不是'lop'...)
同樣,我不認爲這樣的詞幹功能已經在Lucene中。爲自己寫一個將是一個痛苦,並涉及與/進口巨大的字典。

鏈接
這些可能會尋找到,如果你不知道搜索引擎內部信息:
http://en.wikipedia.org/wiki/Index_%28search_engine%29
http://en.wikipedia.org/wiki/Vector_space_model
http://en.wikipedia.org/wiki/Inverted_file
http://en.wikipedia.org/wiki/Term-document_matrix
http://en.wikipedia.org/wiki/Tf-idf