2009-07-27 83 views
5

我在Lucene索引中有一個公司字段。 索引的公司名稱之一是:穆迪在Lucene索引中存儲帶撇號的單詞

當用戶鍵入以下任何關鍵字時,我希望該公司出現在搜索結果中。 1.Moo 2.Mood 3.Moodys 4.Moody的

我應該怎麼這個索引存儲在Lucene和我應該使用哪種類型的Lucene查詢來獲得這種行爲?

謝謝。

+0

答案取決於您希望構建索引的其餘部分的方式: 1.是否應該表示複數化?即「蘋果」和「蘋果」是不同的? 2.你想保留撇號,還是可以消除? 3.公司名稱是否顯得孤立,或在更大的領域內? – 2009-07-28 09:48:24

回答

9

根據您的澄清,我想你的問題分成兩個,回答每個反過來:

  1. 如何撇號I指數的話等同於類似的話沒有撇號?例如映射穆迪穆迪到相同的索引條款。
  2. 如何在Lucene中實現自動完成搜索 - 即給定索引,使用單詞前綴查找文檔,例如地圖MooMoodys

1是比較容易的 - 使用StandardToeknizer創建令牌相結合的撇號和s與前一個單詞,然後StandardFilter除去撇號和s。這將把穆迪轉換成穆迪。 A StandardAnalyzer可以做到這一點以及更多(縮小和停止詞語移除),這可能超過您的需要。使用詞幹分析者應該同時考慮到MoodysMoody。爲此嘗試SnowBallFilter

2更難:Alan所提到的Lucene的PrefixQuery只在公司名稱是字段中的第一個單詞時才起作用。你需要像this question about auto-complete in Lucene的答案。

1

的StandardAnalyser應爲3和4的工作,但是不會爲1和2

工作,而無需編寫自己的(複雜)的文本分析,我會想想你如何預期的公司名稱是搜索。例如,基本lucene搜索語法意味着如果使用通配符搜索「Moo *」和「Mood *」,則可以找到「Moody's」。因此,在提交到lucene之前,您可能需要考慮在搜索字詞後附加「*」,但如果用戶不知道引用通配符,則可能會導致一些混淆。