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

lde*_*ewi 1 keyword azure analyzer azure-cognitive-search

与此问题有点关系并继续: Azure Search Analyzer

我想使用keywordanalyzer进行单词收集.

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

//字段定义:
{
"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":["蓝熊","蓝熊","蓝熊123"]

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

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

这也是我尝试过的:

  • 使用预定义的keywordanalyzer而不是自定义的- >没有成功
  • 而不是使用Collection(Edm.String)我只是用普通的String字段测试它,只包含一个关键字- >没有成功
  • 将字段定义块中的分析器拆分为searchAnalyzer ="lowercaseAnalyzer",filterAnalyzer ="keywordAnalyzer"反之亦然- >没有成功

最后,我能得到的唯一结果是将整个搜索阶段作为单个术语发送.但这应该由分析仪完成,对吧?!

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

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

我的这个问题有什么解决办法吗?或者这种关键词(高分)搜索可能有更好/更容易的方法吗?

谢谢!

Yah*_*osh 7

简短回答:

你正在观察的行为是正确的.

在语义上,您的搜索查询蓝熊意味着:查找所有匹配术语蓝色 术语熊的文档.由于您使用的是关键字tokenizer,因此您编入索引的条款为蓝熊123.您的索引中不存在单独的bluebear这两个术语.这就是为什么只有短语查询返回您期望的结果.


答案很长:

让我解释一下如何在查询处理期间应用分析器以及如何在文档索引期间应用它.

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

  • 蓝熊 (因为你使用小写过滤器蓝熊蓝熊被标记为相同的术语).
  • 蓝熊123

    正如你所期望的那样蓝熊是一个术语 - 在空间上不分成两个 - 因为你正在使用关键字标记器.同样适用于蓝熊123

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

  1. 您的搜索查询也被重写:blue | bear(查找文档蓝色).这是因为默认使用searchMode = any.如果您使用searchMode = all,您的搜索查询将被重写为blue + bear(查找带有蓝色熊的文档).

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

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

  2. 所识别的子查询的查询项由搜索分析器处理.

    在您的示例中,分析器单独处理术语bluebear.它们没有被修改,因为它们已经是小写的.索引中不存在这些令牌,因此不会返回任何结果.

    如果你查询如下:"蓝熊"(带引号)它将被重写为"蓝熊" - 注意没有变化,因为现在你正在寻找一个短语,所以在这些单词之间没有放置OR运算符.查询解析器将整个短语术语(两个单词)传递给分析器,然后分析器输出一个小写的术语:蓝熊.此标记与索引中的标记匹配.

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

我希望这有助于您了解您正在观察的行为.请注意,您可以使用Analyze API测试自定义分析器的输出.