代码之家  ›  专栏  ›  技术社区  ›  ldenkewi

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

  •  4
  • ldenkewi  · 技术社区  · 8 年前

    与这个问题有关或继续的: Azure Search Analyzer

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

    我们有不同领域的文档(产品),如产品名称、品牌、类别等。
    为了实现基于关键字的排名(评分),我想添加一个集合(Edm.String)字段,其中包含不同的(untokenized!!)关键词,如“棕色泰迪”或“绿豆”。
    为此,我考虑使用具有以下定义的关键字分析器:

    //字段定义:
    {


    “分析器”:“关键字分析器”
    }
    ...

    “分析仪”:[ {
    “名称”:“关键字分析器”,
    “@odata.type”:“#Microsoft.Azure.Search.CustomAnalyzer”,

    “令牌过滤器”:[“小写”,“经典”]
    } ]
    ...

    “代币化者”:[{
    “名称”:“keywordTokenizer”,
    @odata.type:“Microsoft.Azure.Search.KeywordTokenizer”
    }

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

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

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

    以下是我尝试过的:

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

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

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

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

    谢谢

    1 回复  |  直到 7 年前
        1
  •  9
  •   Yahnoosh    8 年前

    简而言之:

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

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


    答案很长:

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

    在索引方面,您定义的分析器独立处理关键字列表集合的元素。在倒排索引中结束的项是:

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

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

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

    1. 蓝色|熊 (查找文件 蓝色 searchMode=any 默认情况下使用。如果使用searchMode=all,则搜索查询将重写为 蓝色+熊 蓝色 ).

      查询解析器获取搜索查询字符串,并将查询运算符(如+、|、*等)与查询项分离。然后,它将搜索查询分解为支持类型的子查询,例如,后缀运算符*后面的术语成为前缀查询,带引号的术语成为短语查询等。不在任何支持运算符之前或之后的术语成为单个术语查询。

      在您的示例中,查询解析器分解了查询字符串 蓝色|熊 蓝色 分别地搜索引擎查找与这些查询匹配的文档(searchMode=any)。

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

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

      如果查询如下所示: “蓝熊” (带引号)它将被改写为 “蓝熊” 蓝熊 .此标记与索引中的内容匹配。

    我希望这能帮助你理解你观察到的行为。注意,您可以使用 Analyze API .