0

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

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

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

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

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

4

1 回答 1

1

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

例如考虑“阀门”这个词。雪球分析仪会将其限制为“valv”。

因此,在搜索时,由于您停止输入查询,“阀门”和“阀门”都将被分解为“阀门”。使用TermQuery词干的Term“valv”将在“valve”和“valve”出现时产生匹配。

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

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

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

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

于 2012-08-07T15:50:51.353 回答