我正在使用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,第二个查询实际上返回了文档。
我知道停止词会从索引中删除,可能是从查询中删除,但似乎我错过了一些基本的东西。
答案 0 :(得分:0)
虽然在分析过程中确实删除了该单词,但看起来2.9之后的默认行为是启用位置增量。因此,虽然单词被删除并且不会对分数有所贡献,但在短语查询中,预期“停止”和“单词”将在它们之间具有(删除)术语。在Lucene 2.4中,此功能已存在,但默认情况下已关闭。您可以在StopFilter.getEnablePositionIncrementsVersionDefault
:
public static boolean getEnablePositionIncrementsVersionDefault(Version matchVersion) {
return matchVersion.onOrAfter(Version.LUCENE_29);
}
例如,如果您尝试搜索“停止进入单词”,我预计您会看到版本3.0的命中。
PositionIncrementAttribute documentation简要提出了这个想法:
将其设置为大于1的值以禁止精确的词组匹配。例如,如果一个人不希望短语在删除的停用词之间匹配,那么可以建立一个停用词过滤器来删除停用词,并将增量设置为在每个不停止词之前删除的停用词的数量。然后,精确的短语查询将仅在术语出现时匹配,而不会插入中间停用词。