Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在azure搜索中实际使用关键字分析器?_Azure_Keyword_Analyzer_Azure Cognitive Search - Fatal编程技术网

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

如何在azure搜索中实际使用关键字分析器?,azure,keyword,analyzer,azure-cognitive-search,Azure,Keyword,Analyzer,Azure Cognitive Search,与这个问题有点关联和延续: 我想使用关键字分析器来收集单词 我们有不同领域的文件(产品),如产品名称、品牌、分类等 为了实现基于关键字的排名(评分),我想添加一个集合(Edm.String)字段,其中包含不同的(未分类!!)关键字,如:“brown teddy”或“green bean” 为了实现这一点,我考虑使用具有以下定义的关键字分析器: //字段定义: { “名称”:“关键字列表”, “类型”:“集合(Edm.String)”, “分析器”:“关键字分析器” } … “分析仪”:[ {

与这个问题有点关联和延续:

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

我们有不同领域的文件(产品),如产品名称、品牌、分类等
为了实现基于关键字的排名(评分),我想添加一个集合(Edm.String)字段,其中包含不同的(未分类!!)关键字,如:“brown teddy”或“green bean”
为了实现这一点,我考虑使用具有以下定义的关键字分析器:

//字段定义:
{
“名称”:“关键字列表”,
“类型”:“集合(Edm.String)”,
“分析器”:“关键字分析器”
}


“分析仪”:[ {
“名称”:“关键字分析器”,
“@odata.type”:“#Microsoft.Azure.Search.CustomAnalyzer”,
“标记器”:“关键字标记器”,
“令牌过滤器”:[“小写”、“经典”]
}]


“标记化者”:[{
“名称”:“关键字标记器”,
“@odata.type”:“#Microsoft.Azure.Search.KeywordTokenizer”
}

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

“关键字列表”:[ “蓝熊”, “蓝熊”, “蓝熊123” ]

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

{ 搜索:“蓝熊”, 计数:“正确”, 查询类型:“完整” }

以下是我也尝试过的:

  • 使用预定义的关键字分析器而不是自定义的->不成功
  • 我没有使用Collection(Edm.String),而是用一个普通的字符串字段测试它,该字段只包含一个关键字->不成功
  • 将字段定义块中的分析器拆分为searchAnalyzer=“lowercaseAnalyzer”和filterAnalyzer=“keywordAnalyzer”反之亦然->未成功
最后,我能得到的唯一结果是把整个搜索阶段作为一个单独的项发送出去。但这应该由分析仪来完成,对吗

{ 搜索:“\”蓝熊\“, 计数:“正确”, 查询类型:“完整” }

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

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

谢谢!

简短回答:

你观察到的行为是正确的

从语义上讲,您的搜索查询蓝熊意味着:查找与术语blue匹配的所有文档。因为您使用的是关键字标记器,所以您索引的术语是blue bear和blue bear 123。您的索引中不存在术语blue和bear。这就是为什么只有短语query ret返回您期望的结果


长答覆:

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

在索引方面,您定义的分析器独立处理关键字列表集合的元素。最终在反向索引中出现的术语包括:

  • blue bear(因为您使用的是小写过滤器,所以blue bear和blue bear被标记为相同的术语)
  • 蓝熊123

    正如您所期望的,blue bear是一个术语,而不是在空间上拆分为两个术语,因为您使用的是关键字标记器。blue bear 123也是如此

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

  • 您的搜索查询也会被重写:blue | bear(查找文档blue或bear)。这是因为默认情况下使用了。如果使用searchMode=all,您的搜索查询将被重写为blue+bear(查找带蓝色和bear的文档)

    查询解析器接受搜索查询字符串并分离查询运算符(如+、|、*等)从查询词。然后,它将搜索查询分解为支持类型的子查询,例如,后跟后缀运算符“*”的词将成为前缀查询,引用的词将成为短语查询等。未后跟任何支持运算符的词将成为单个词查询

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

  • 已识别子查询的查询项由搜索分析器处理

    在您的示例中,术语blue和bear由分析器单独处理。它们不会被修改,因为它们已经是小写的。索引中不存在这些标记,因此不会返回任何结果

    如果查询如下所示:“Blue Bear”(带引号)将被重写为“Blue Bear”-请注意,没有任何更改,因为您现在正在查找一个短语,所以没有在单词之间放置OR运算符。查询解析器传递整个短语术语(两个单词)向分析器输出一个小写术语:blue bear。此标记与索引中的内容匹配

  • 这里的关键经验是,查询解析器在应用分析器之前处理查询字符串。分析器应用于查询解析器标识的子查询的各个术语


    我希望这有助于您理解所观察到的行为。请注意,您可以使用来测试自定义分析器的输出。

    谢谢您非常详细的回答。您能给我一些建议,在我的情况下如何使用关键字分析器,或者我最好使用另一种方法吗?目前我所能想到的就是制作s每个查询由dup执行