如何在 azure-search 中实际使用关键字分析器?

How to practially use a keywordanalyzer in azure-search?

与这个问题有关并继续:

我想使用关键字分析器来收集单词。

我们有文档(产品),其中包含 product_name、品牌、类别等不同的字段。
要实现基于关键字的排名(评分),我想添加一个 Collection(Edm.String) 字段,其中包含不同的(未标记化!!)关键字,例如:"brown teddy" 或 "green bean"。
为此,我考虑使用具有以下定义的关键字分析器:

// field definition:
{
"name": "keyWordList",
"type": "Collection(Edm.String)",
"analyzer": "keywordAnalyzer"
}
...

"analyzers": [ {
"name":"keywordAnalyzer",
"@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
"tokenizer":"keywordTokenizer",
"tokenFilters":[ "lowercase", "classic" ]
} ]
...

"tokenizers": [{
"name": "keywordTokenizer",
"@odata.type": "#Microsoft.Azure.Search.KeywordTokenizer"
}

现在上传了一些文档后,我无法通过准确输入所选关键字来找到这些字段。 例如,这是一个包含以下字段数据的文档:

"keyWordList": [ "Blue Bear", "blue bear", "blue bear123" ]

我无法通过查询以下搜索找到任何结果:

{ search:"blue bear", count:"true", queryType:"full" }

这也是我尝试过的:

最后我唯一能得到的结果是将整个搜索阶段作为一个术语发送。不过这个应该是分析器来做吧?!

{ search:"\"blue bear\"", count:"true", queryType:"full" }

用户不知道他们是搜索现有关键字还是执行标记化搜索。这就是为什么这不是一个选项。

我的这个问题有什么解决办法吗? 或者对于这种关键字(高分)搜索是否有更好/更简单的方法?

谢谢!

简答:

您观察到的行为是正确的。

从语义上讲,您的搜索查询 blue bear 表示:查找所有与词条 blue or[= 匹配的文档81=] 术语 。由于您使用的是关键字分词器,因此您索引的术语是 blue bearblue bear123。术语 bluebear 单独不存在于您的索引中。这就是为什么只有短语查询 returns 您期望的结果。


长答案:

让我解释一下在查询处理过程中如何应用分析器以及在文档索引过程中如何应用分析器。

在索引方面,您定义的分析器独立处理 keyWordList 集合的元素。最终出现在倒排索引中的术语是:

  • blue bear(因为您使用的是小写过滤器 blue bearBlue Bear 被标记为相同的术语)。
  • 蓝熊123

    正如您所期望的那样,blue bear 是一个术语 - 在 space 上没有分成两个术语 - 因为您使用的是关键字分词器。同样适用于blue bear123

在查询处理方面,发生了两件事:

  1. 您的搜索查询也被重写:blue|bear(查找文档 blue)。这是因为默认使用 searchMode=any。如果您使用 searchMode=all,您的搜索查询将被重写为 blue+bear(查找具有 bluebear[ 的文档=82=]).

    查询解析器获取您的搜索查询字符串并将查询运算符(如 +、|、* 等)与查询词分开。然后它将搜索查询分解为支持类型的子查询,例如,后缀运算符“*”后面的术语成为前缀查询,引用的术语成为短语查询等。任何受支持的运算符之前或之后都没有的术语成为单独的术语查询.

    在您的示例中,查询解析器将您的查询字符串 blue|bear 分解为两个术语查询,其中包含术语 blue分别。搜索引擎查找与任何这些查询匹配的文档 (searchMode=any)。

  2. 已识别子查询的查询词由搜索分析器处理。

    在您的示例中,术语 bluebear 由分析器单独处理。它们没有被修改,因为它们已经是小写了。 None 个标记存在于您的索引中,因此不会返回任何结果。

    如果您查询如下:"Blue Bear"(带引号)它将被重写为 "Blue Bear" - 注意没有变化,OR 运算符没有放在单词之间,因为现在您正在寻找一个短语。查询解析器将整个短语术语(两个词)传递给分析器,分析器依次输出一个小写的术语:blue bear。此令牌与您的索引中的内容相匹配。

这里的关键教训是查询解析器在应用分析器之前处理查询字符串。分析器应用于查询分析器识别的子查询的各个术语。

我希望这可以帮助您了解您正在观察的行为。请注意,您可以使用 Analyze API.

测试自定义分析器的输出