【问题标题】:Strange behavior using the wildcard character for certain keywords对某些关键字使用通配符的奇怪行为
【发布时间】:2021-10-22 10:26:59
【问题描述】:

在我的 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 文档说:

注意:您不能使用 * 或 ?符号作为 a 的第一个字符 搜索。

发件人: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 个结果)。

感谢您的帮助。

【问题讨论】:

    标签: lucene azure-cognitive-search


    【解决方案1】:

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

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

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

    另一方面,Microsoft 分析器(在本例中为 en.microsoft 分析器)更高级一些,并使用词形还原 而不是词干。这意味着所有生成的令牌都应该是 有效的英语单词。例如,“终止”、“终止”和 “终止”将主要保留在索引中,并且将是 对于非常依赖通配符和 模糊搜索。

    【讨论】:

    • 谢谢!如果我切换到 En.Microsoft 分析器,您是否知道布尔运算符、字段搜索或邻近搜索的语法是否与那篇文章中的相同?我找不到 En.Microsoft 分析器的同等文章。
    • 无论你使用什么分析器,搜索语法都是一样的。
    • 这也是我根据我的测试注意到的,但很高兴得到确认,谢谢。微软真的应该重命名那篇文章中的 H1,以免给人留下它只适用于 Lucene 分析器的印象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多