【问题标题】:Lucene : searching without stop words does not return resultsLucene:没有停用词的搜索不会返回结果
【发布时间】:2014-03-03 04:31:22
【问题描述】:

我使用的是 Lucene.net 3.0.3,但我不明白停用词在查询中应该如何工作。

我有这个文本作为输入:Stop the word

我使用 StandardAnalyzer(Version.LUCENE_30) 进行索引和查询。索引有一个字段Title

该字段设置为存储和分析。我也玩过不同的 TermVector。 对于查询解析,我使用简单的 QueryParser.Parse 和

这是问题:

  • 查询Title:stop the word 返回文档 - 这很好
  • Title:stop word 的查询不返回文档 - 我期待它,因为停用词已从索引中删除。

然后我切换到 LUCENE_24 并且第二个查询实际上返回了文档。

我知道停用词已从索引中删除,并且可能从查询中删除,但似乎我缺少一些基本内容。

【问题讨论】:

  • 停用词不会从查询中删除,但会在实际搜索/结果中被忽略。
  • 这也是我的理解,但 TopDocs.TotalHits 返回 0 个文档。
  • 您确定您输入的所有 3 个词都没有被声明为停用词并被忽略吗?不知道 lucene 是怎么做的,但是大多数其他搜索引擎会考虑出现超过 50% 的时间的词作为停用词候选。
  • 我使用的是标准的英文停用词列表,其中没有“stop”和“word”。我使用 Luke.net 来检查索引,它显示 stop 和 word 作为术语。

标签: lucene


【解决方案1】:

虽然在分析过程中确实删除了这个词,但似乎 2.9 之后的默认行为是启用位置增量。因此,虽然单词被删除并且不会对分数做出贡献,但在短语查询中,预计“stop”和“word”之间将有一个(删除的)术语。在 Lucene 2.4 中,这个功能已经存在,但默认是关闭的。你可以在StopFilter.getEnablePositionIncrementsVersionDefault的实现中看到这一点:

public static boolean getEnablePositionIncrementsVersionDefault(Version matchVersion) {
    return matchVersion.onOrAfter(Version.LUCENE_29);
}

例如,如果您尝试搜索“stop into word”,我希望您会看到 3.0 版的热门搜索。

PositionIncrementAttribute documentation 简要地给出了这个想法:

将其设置为大于 1 的值以禁止精确的短语匹配。例如,如果不希望短语在移除的停用词之间匹配,那么可以构建一个停用词过滤器来移除停用词,并将增量设置为在每个非停用词之前移除的停用词的数量。然后,只有在没有插入停用词的术语出现时,才会匹配精确的短语查询。

【讨论】:

  • 是的,这也是我观察到的。我想也许我可以在索引时从数据中删除停用词,然后在查询时从查询中删除。
  • 但我从搜索的角度考虑更多:你认为如果我有一个默认行为(至少在 lucene.net 3.0.3 中)是不返回匹配项是否有意义他们之间的停用词?我看不出这是默认行为的原因。
  • 我明白它背后的理由,如果这就是你要问的。特别是“停止”这个词在两​​种情况下的使用方式大不相同,因此删除的词的存在提供了有关该词用法的信息。去除停用词并不是真的要创建模糊匹配(有很多方法可以做到这一点),它的目的是通过不评估一堆无意义的匹配来提高性能并提高得分。在保持尽可能多的信息的同时保持这些好处对我来说绝对是有意义的。
  • 也许我应该举一个更好的例子作为输入:Lucene 很棒。使用标准查询解析器无法匹配“lucene awesome”。听起来我需要更改查询的构建方式,或者有一个自定义的停用词分析器。
  • 考虑一下:“他们的”是默认停用词。 “我们的”不是。如果您希望“get stuff”匹配“get our stuff”,则需要在短语查询中将 slop 设置为 1 或更高。 “得到他们的东西”的行为是否应该有所不同?
最近更新 更多