2009-07-27 68 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之前,您可能需要考虑在搜索字词后附加“*”,但如果用户不知道引用通配符,则可能会导致一些混淆。