lucene 对某些关键字使用通配符时出现异常行为

wkyowqbh  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(167)

在我的azure认知搜索索引中,当我搜索“education”一词时,我得到了660个匹配项。当我搜索“educational”一词时,我也得到了660个匹配项。两者似乎都返回了相同的结果,其中包含了该词的两种变体。
但是,在使用通配符时,我看到了非常奇怪的行为:

edu* returns 660 results (expected)
educ* returns 660 results (expected)
educa* returns 2 results (matches two instances of the hyphenated word "educa-tion")
educat* returns 0 results (unexpected)
educati* returns 0 results (unexpected)
educatio* returns 0 results (unexpected)

每个搜索字段都使用英语Lucene语言分析器,并且queryType设置为“full”,searchMode设置为“all”。
为什么最后的结果没有返回任何内容?
顺便说一句,我发现了关于在单词开头使用通配符的相互矛盾的信息。
Lucene文档中说:
附注:您不能使用 * 或?符号作为搜寻的第一个字符。
发件人:https://lucene.apache.org/core/2_9_4/queryparsersyntax.html
但在微软的网站上,他们似乎暗示它应该工作:
字词片段会出现在 * 或?之后,并以正斜扛来分隔建构。例如,search=/.*numeric./会传回“英数字元”。
来源:https://learn.microsoft.com/en-us/azure/search/query-lucene-syntax#bkmk_wildcard
我已经尝试了 *ducation(返回错误)和/.*ducation./(返回0个结果)。
谢谢你的帮助。

j9per5c4

j9per5c41#

当您使用英语Lucene分析器时,您的内容会被积极地进行词干分析。这在“分析器对通配符查询的影响”一节中提供的链接中有解释。如果您改用Microsoft英语分析器,您的示例应该会按预期工作。
https://learn.microsoft.com/en-us/azure/search/query-lucene-syntax#impact-of-an-analyzer-on-wildcard-queries
如果您要使用en.lucene(英语Lucene)分析器,它会对每个术语应用积极的词干分析。例如,'terminate'、'termination'、'terminals'都会在索引中被标记为'termi'。另一方面,使用通配符或模糊搜索的查询中的术语根本不会被分析。因此,不会有与'terminat*'查询匹配的结果。
另一方面,微软的分析器(在本例中是en.microsoft分析器)更高级一些,它使用词形分解而不是词干分解。这意味着生成的所有标记都应该是有效的英语单词。例如,“terminate”、“terminals”和“termination”在索引中大部分都是完整的,对于大量依赖通配符和模糊搜索的情况,这是一个更好的选择。

相关问题