首页 > 解决方案 > 对某些关键字使用通配符的奇怪行为

问题描述

在我的 azure 认知搜索索引中,当我搜索“教育”一词时,我得到了 660 次点击。当我搜索“教育”这个词时,我也得到了 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 ://docs.microsoft.com/en-us/azure/search/query-lucene-syntax#bkmk_wildcard

我试过 *ducation (返回错误)和 /.*ducation./ (返回 0 个结果)。

感谢您的帮助。

标签: luceneazure-cognitive-search

解决方案


当您使用英语 Lucene 分析器时,您的内容会被积极地提取。这在您在“分析器对通配符查询的影响”部分中提供的链接中进行了解释。如果您更改为 Microsoft 英语分析器,您的示例应该可以按预期工作。

https://docs.microsoft.com/en-us/azure/search/query-lucene-syntax#impact-of-an-analyzer-on-wildcard-queries

如果您要使用 en.lucene(英文 Lucene)分析器,它将对每个术语应用积极的词干提取。例如,“terminate”、“termination”、“terminates”都将被标记为索引中的标记“termi”。另一方面,使用通配符或模糊搜索的查询中的术语根本不会被分析,因此不会有与“terminat*”查询匹配的结果。

另一方面,Microsoft 分析器(在本例中为 en.microsoft 分析器)更先进一些,并且使用词形还原而不是词干提取。这意味着所有生成的标记都应该是有效的英文单词。例如,'terminate'、'terminates' 和 'termination' 将在索引中保持完整,对于非常依赖通配符和模糊搜索的场景来说,这将是一个更可取的选择。


推荐阅读