【问题标题】:Storing words with apostrophe in Lucene index在 Lucene 索引中存储带撇号的单词
【发布时间】:2010-11-14 12:16:13
【问题描述】:

我在 Lucene 索引中有一个公司字段。 被索引的公司名称之一是:穆迪

当用户输入以下任何关键字时,我希望这家公司出现在搜索结果中。 1.哞 2.心情 3.穆迪 4.穆迪

我应该如何在 Lucene 中存储这个索引以及我应该使用什么类型的 Lucene 查询来获得这种行为?

谢谢。

【问题讨论】:

  • 答案取决于您希望构建索引其余部分的方式: 1. 是否应该表示多元化?即“Apple”和“Apples”是否不同? 2. 你想保留撇号,还是可以去掉? 3. 公司名称是孤立的还是位于更大的字段中?
  • 感谢您的 cmets...我的回复 1.否 2.我希望 Lucene 不要保留撇号 3.公司名称可能会出现孤立以及更大的字段

标签: lucene lucene.net


【解决方案1】:

根据您的说明,我想将您的问题一分为二,依次回答:

  1. 如何将带撇号的单词索引为等同于不带撇号的相似单词?例如将 MoodysMoody's 映射到同一个索引词。
  2. 如何在 Lucene 中实现自动完成搜索 - 即给定索引,使用单词前缀查找文档,例如将 Moo 映射到 Moodys

1 相对简单 - 使用 StandardToeknizer 创建将撇号和 s 与前一个单词组合的标记,然后使用 StandardFilter 删除撇号和 s。这会将穆迪转换为穆迪。 StandardAnalyzer 可以做到这一点以及更多(小写和停用词删除),这可能超出您的需要。使用词干分析器应该将 MoodysMoody 带入同一个标记。试试SnowBallFilter

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 2017-09-05
      • 1970-01-01
      • 2014-07-07
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多