在Lucene索引中存储带撇号的单词

时间:2009-07-27 21:22:58

标签: lucene lucene.net

我在Lucene Index有一个公司领域。 其中一个索引的公司名称是:穆迪的

当用户键入以下任意关键字时,我希望该公司出现在搜索结果中。 1.Moo 2.Mood 3.Moodys 4.Moody的

我应该如何在Lucene中存储此索引以及我应该使用什么类型的Lucene Query来获取此行为?

感谢。

2 个答案:

答案 0 :(得分:9)

根据您的澄清,我想将您的问题分成两部分,然后依次回答:

  1. 如何将带撇号的单词编码为与没有撇号的单词相同?例如将 Moodys Moody的映射到相同的索引词。
  2. 如何在Lucene中实现自动完成搜索 - 即给定索引,使用单词前缀查找文档,例如将 Moo 映射到 Moodys
  3. 1相对简单 - 使用StandardToeknizer创建一个将撇号和s与前一个单词组合在一起的标记,然后使用StandardFilter来删除撇号和s。这将把穆迪转变为穆迪。 StandardAnalyzer执行此操作以及更多(小写和停止删除单词),这可能比您需要的更多。使用词干分析器应该同时使用 Moodys Moody 。请尝试SnowBallFilter

    2更难:Alan提到的Lucene PrefixQuery只有在公司名称是字段中的第一个单词时才会起作用。你需要类似this question about auto-complete in Lucene的答案。

答案 1 :(得分:1)

StandardAnalyser应该适用于3和4,但不适用于1和2。

如果不编写自己的(复杂的)文本分析器,我会考虑您希望如何搜索公司名称。例如,基本的lucene搜索语法意味着如果使用通配符搜索,您可以找到“Moody's”:“Moo *”和“Mood *”。因此,您可能需要考虑在提交到lucene之前在搜索词中附加“*”,但是如果用户不知道这个通配符的添加,这可能会引起一些混淆。