Azure搜索-分析器

时间:2018-10-02 17:14:28

标签: azure-search

我正在使用文件搜索工具,例如:

A)
Code: AB-Y X6 8BD
Name: Notebook AZX
Manufacturer: DELL

B)
Code: AB-Y X6 9BD
Name: Notebook 8BD
Manufacturer: DELL

我需要实现的是一个仅在用户键入“代码”字段中包括的所有字符时才匹配“代码”字段上的文档的查询。也可以搜索“名称”和“制造商”之类的其他字段,但不需要“名称”字段完全匹配。使得用户输入不同格式的代码不是一件容易的事:带空格或不带空格,带-或不带空格。使用Azure搜索可以实现吗?我当时在考虑用于“代码”字段和字段范围查询的keywordanalyzer,但我不知道用户在搜索查询中的代码位置。

下面是一些示例,以便更好地了解我要达到的目标:

- query 'ABYX6 8BD DELL AZX' - returns product A
- query 'ABYX6 DELL AZX' - empty result
- query 'DELL ABYX69BD AZX' - returns product 
- query 'DELL Notebook' - returns product A & B

1 个答案:

答案 0 :(得分:0)

您的问题分为2部分:

  1. 如何规范产品代码(删除空格和连字符)
  2. 如何将正确的分析器应用于查询字符串的组件,以实现不同字段的不同行为(要求代码字段完全匹配)

对于产品代码规范化,您可以使用一些custom analyzer功能:

  1. Mapping char filter。 “一个char过滤器,该过滤器应用使用mappings选项定义的映射。匹配是贪婪的(在给定点的最长模式匹配为准)。允许将替换为空字符串。”我们将使用它从产品代码中删除连字符和空格。
  2. Uppercase。 “将令牌文本标准化为大写。”这意味着用户不必担心产品代码字母大写

这是设置了这些分析器选项的索引的完整示例。示例索引具有一个id字段。 id类似于产品代码

{
    "analyzers":  [
                      {
                          "@odata.type":  "#Microsoft.Azure.Search.CustomAnalyzer",
                          "tokenFilters":  [
                                               "uppercase"
                                           ],
                          "charFilters":  [
                                              "hyphen-filter"
                                          ],
                          "name":  "id-analyzer",
                          "tokenizer":  "standard_v2"
                      }
                  ],
    "charFilters":  [
                        {
                            "mappings":  [
                                             "-=>",
                                             "\\u0020=>"
                                         ],
                            "name":  "hyphen-filter",
                            "@odata.type":  "#Microsoft.Azure.Search.MappingCharFilter"
                        }
                    ],
    "name":  "index",
    "fields":  [
                   {
                       "key":  true,
                       "name":  "key",
                       "type":  "Edm.String"
                   },
                   {
                       "analyzer":  "id-analyzer",
                       "name":  "id",
                       "type":  "Edm.String"
                   }
               ]
 }

您可以在此处找到create index调用的完整文档。请注意,由于不支持自定义分析器,因此您可能无法使用门户。

确保查询的产品代码部分位于词组内,例如“ ABYX6 8BD DELL AZX”-这样,查询解析器会将整个词组作为令牌发送给词法分析器进行处理。您可以在这里了解更多信息:How full text search works in Azure Search

第二个问题比较棘手。如果您不知道产品代码在查询字符串中的哪个位置,那么我们就不会知道。除非使用字段搜索语法,否则将使用在该字段上配置的分析器来独立处理每个字段的整个查询字符串。这意味着,如果我们正确执行规范化,则对于查询“ ABYX6 8BD DELL AZX”,Azure搜索将尝试匹配术语 -ABYX68BDDELLAZX –针对“代码”字段 -abyx6 8bd dell azx –假设其他两个字段使用的是标准分析仪,则为

第一个查询不匹配,因此将仅返回在“名称”或“制造商”中有dell或azx的文档。

我建议修改应用程序的用户体验,以允许用户独立输入产品代码,从而在格式上有所不同。唯一的另一种选择是将任何查询视为自由文本查询,并允许搜索引擎匹配许多结果,并将匹配更多词语的结果排名更高。

如果您还有其他问题,请告诉我。

谢谢, 马特