我正在编辑lucene .net实现(2.3.2),包括词干和自动通配符(在单词的末尾添加*)。
我发现带有通配符的确切单词不起作用。 (所以stack *适用于stackoverflow,但stackoverflow *没有得到命中),并且想知道是什么导致了这个,以及如何修复它。
提前致谢。 (还要感谢不要问我为什么要实现两个自动通配符和词干。)
我即将使查询始终为查询前缀,因此我不必为查询添加任何讨厌的“*”,因此我们将看到是否有任何变得清晰。
编辑:只有被阻止的单词才能使用通配符。示例硅酸盐*不起作用,但硅*不起作用。
答案 0 :(得分:1)
它不起作用的原因是因为你阻止了内容,从而改变了术语。
例如,考虑“阀门”这个词。雪球分析仪将其降至“valv”。
因此,在搜索时,由于您阻止输入查询,“阀门”和“阀门”都将被限制为“valv”。使用词干TermQuery
“valv”的Term
将产生“阀门”和“阀门”出现的匹配。
但是现在,因为在索引中存储了Term
“valv”,对“valve *”的查询将不匹配任何内容。这是因为QueryParser
未在通配符查询上运行Analyzer
。
AnalyzingQueryParser可以处理其中一些案例,但我不认为它是在2.3.x版本的Lucene中。无论如何,它不是通用的,文档说:
警告:此类只应与不使用停用词或添加令牌的分析器一起使用。此外,一些词干分析器是不合适的:例如,GermanAnalyzer会将Häuser变为hau,但是H?user在使用此解析器时将成为用户,因此不会发现匹配(即使用此解析器将不会改进QueryParser这种情况)。
我所链接的副本中提到的解决方案适用于所有情况,但您将获得更大的索引。