【问题标题】:Stemming + wildcarding: unexpected effects词干+通配符:意想不到的效果
【发布时间】:2012-08-04 09:28:10
【问题描述】:

我正在编辑一个 lucene .net 实现 (2.3.2) 以包括词干和自动通配符(在单词末尾添加 *)。

我发现带有通配符的确切单词不起作用。 (所以 stack* 适用于 stackoverflow,但 stackoverflow* 没有受到影响),并且想知道是什么原因造成的,以及如何解决它。

提前致谢。 (也感谢你没有问我为什么要实现自动通配符和词干。)

我将让查询始终作为查询的前缀,这样我就不必在查询中添加任何讨厌的“*”,所以我们会看看是否有什么变得清楚。

编辑:只有词干的词不能使用通配符。示例 Silicate* 不起作用,但 silic* 起作用。

【问题讨论】:

  • 您的分析器标记器如何“stackoverflow”?
  • 肯定是重复的(抱歉),但不是完全一致的。我不明白为什么这不起作用。我想这是因为通配符短语的分析方式与索引不同,但更具体的答案可能会对我有所帮助。
  • @jpountz 抱歉,刚刚意识到它只发生在词干的情况下。所以“硅酸盐*”不起作用,但“stackoverflow*”确实起作用。

标签: lucene lucene.net wildcard stemming


【解决方案1】:

它不起作用的原因是因为你阻止了内容,从而改变了术语。

例如考虑“阀门”这个词。雪球分析器会将其归结为“valv”。

因此,在搜索时,由于您对输入查询进行了提取,因此“valve”和“valves”都将被提取为“valv”。使用带有词干的Term“valv”的TermQuery 将在“valve”和“valve”出现时产生匹配。

但是现在,由于您在索引中存储了Term“valv”,因此对“valve*”的查询将不会匹配任何内容。这是因为QueryParser 不会在通配符查询上运行Analyzer

AnalyzingQueryParser 可以处理其中一些情况,但我不认为它出现在 Lucene 的 2.3.x 版本中。无论如何,它不是通用的,文档说:

警告:此类只能与不使用停用词或添加标记的分析器一起使用。此外,一些词干分析器是不合适的:例如,GermanAnalyzer 会将 Häuser 转换为 hau,但使用此解析器时 H?user 将变为 h?user,因此找不到匹配项(即使用此解析器不会比 QueryParser 中的此类情况)。

我链接的副本中提到的解决方案适用于所有情况,但您会获得更大的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 2016-01-14
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多