使用分析器和标记化术语改进索引

已完成

默认情况下,Azure AI 搜索配置为分析文本并标识对索引有用的标记。 正确的标记确保用户可以快速找到所需的文档。 在大多数情况下,默认配置生成最佳索引。 但是,如果具有异常字段或唯一字段,可能需要准确配置如何分析文本。

在这里,你将了解如何定义自定义分析器,以控制字段内容如何拆分为标记以包含在索引中。

AI 搜索为内容编制索引时,它会检索文本。 若要生成有用的索引,其中包含帮助用户查找文档的术语,该文本需要处理。 例如:

  • 文本应拆分为单词,通常使用空格和标点符号作为分隔符。
  • 应删除非索引字(如“the”和“it”),因为用户不会搜索它们。
  • 单词应还原为其原形。 例如,过去时态单词(如“ran”)应替换为现在时态单词(如“run”)。

在 AI 搜索中,这种处理由分析器执行。 如果未为字段指定分析器,将使用默认 Lucene 分析器。 对于大多数字段,默认 Lucene 分析器是一个不错的选择,因为它可以处理多种语言并为索引返回有用的标记。

或者,可以指定 AI 搜索中内置的分析器之一。 内置分析器有两种类型:

  • 语言分析器。 如果需要特定语言的高级功能(如词形还原、单词分解和实体识别),请使用内置语言分析器。 Microsoft 为不同语言提供 50 个分析器。
  • 专用分析器。 这些分析器与语言无关,用于专用字段,例如邮政编码或产品 ID。 例如,可以使用 PatternAnalyzer 并指定正则表达式以匹配标记分隔符。

什么是自定义分析器?

内置分析器为你提供许多选项,但有时需要具有字段异常行为的分析器。 在这些情况下,可以创建自定义分析器

自定义分析器包括:

  • 字符筛选器。 这些筛选器在字符串到达 tokenizer 之前对它进行处理。
  • Tokenizer。 这些组件将文本划分为要添加到索引的标记。
  • 标记筛选器。 这些筛选器删除或修改由 tokenizer 发出的标记。

让我们更详细地查看这些组件。

字符筛选器

在将文本拆分为标记之前,可能需要对文本完成某些操作。 字符筛选器启用这些操作。 可以使用三个字符筛选器:

  • html_strip。 此筛选器删除 HTML 构造,如标记和属性。
  • mapping。 使用此筛选器可以指定将一个字符串替换为另一个字符串的映射。 例如,可以指定将 TX 替换为 Texas 的映射。
  • pattern_replace。 使用此筛选器可以指定一个正则表达式,用于标识输入文本中的模式以及如何替换匹配文本。

Tokenizer

tokenizer 是将文本划分为将存储在索引中的标记的组件。 tokenizer 还会将单词分解为其原形。 通常,标记是一个单词,但你可能想要创建异常标记,例如:

  • 完整的邮政地址。
  • 完整的 URL 或电子邮件地址。
  • 基于特定语言的语法的单词。

有 13 个不同的 tokenizer 可供选择。 这些 tokenizer 包括:

  • classic。 此 tokenizer 基于欧洲语言的语法处理文本。
  • 关键字 此 tokenizer 将整个输入作为单个标记发出。 将此 tokenizer 用于应始终作为一个值编制索引的字段。
  • lowercase。 此 tokenizer 将文本划分为非字母,然后将生成的标记修改为所有小写。
  • microsoft_language_tokenizer。 此 tokenizer 基于指定的语言的语法划分文本。
  • pattern。 此 tokenizer 在与指定的正则表达式匹配的位置划分文本。
  • whitespace。 此 tokenizer 在有空格的位置划分文本。

注意

有关 tokenizer 的完整列表,请参阅下面的“了解详细信息”部分中的“将自定义分析器添加到 Azure AI 搜索索引中的字符串字段”

标记筛选器

tokenizer 将传入文本划分为标记后,可能需要添加一些额外的处理,例如删除非索引字或剪裁标点符号。 可以通过指定标记筛选器来执行此处理。 有 41 个不同的标记筛选器可用,包括:

  • 特定于语言的筛选器,例如 arabic_normalization。 这些筛选器应用特定于语言的语法规则,以确保删除单词的形式并将其替换为原形。
  • apostrophe。 此筛选器从标记中删除任何撇号,以及撇号后面的任何字符。
  • classic。 此筛选器从首字母缩略词中删除英语所有格和点。
  • keep。 此筛选器从指定的列表中删除不包含一个或多个单词的任何标记。
  • 此筛选器删除长于指定的最小值或短于指定的最大值的任何标记。
  • trim。 此筛选器从标记中删除任何前导和尾随空格。

注意

有关标记筛选器的完整列表,请参阅下面的“了解详细信息”部分中的“将自定义分析器添加到 Azure AI 认知搜索索引中的字符串字段”

创建自定义分析器

通过在定义索引时指定一个自定义分析器进行创建。 必须使用 JSON 代码执行此操作 - 无法在 Azure 门户中指定自定义索引。 在设计时使用 analyzers 部分。 只能包含一个 tokenizer,但包含一个或多个字符筛选器以及一个或多个标记筛选器。 对分析器使用唯一名称,并将 @odata.type 属性设置为 Microsoft.Azure.Search.CustomAnalyzer

在此示例中,字符筛选器删除 HTML 格式,tokenizer 根据冰岛文的语法拆分文本,标记筛选器删除撇号:

"analyzers":(optional)[
   {
      "name":"ContosoAnalyzer",
      "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
      "charFilters":[
         "WebContentRemover"
      ],
      "tokenizer":"IcelandicTokenizer",
      "tokenFilters":[
         "ApostropheFilter"
      ]
   }
],
"charFilters":(optional)[
   {
      "name":"WebContentRemover",
      "@odata.type":"#html_strip"
   }
],
"tokenizers":(optional)[
   {
      "name":"IcelandicTokenizer",
      "@odata.type":"#microsoft_language_tokenizer",
      "language":"icelandic",
      "isSearchTokenizer":false,
   }
],
"tokenFilters":(optional)[
   {
      "name":"ApostropheFilter",
      "@odata.type":"#apostrophe"
   }
]

测试自定义分析器

将自定义分析器定义为索引的一部分后,可以使用 REST API 的“分析文本”函数提交测试文本并确保分析器正确返回标记。 使用任何 REST 测试工具来制定这些请求,例如常用的 Postman 应用程序。

测试 REST 请求应如下所示:

POST https://<search service name>.search.windows.net/indexes/<index name>/analyze?api-version=<api-version>
   Content-Type: application/json
   api-key: <api key>

在此请求中:

  • <search service name> 替换为 AI 搜索资源的名称。
  • <index name> 替换为包含自定义分析器的索引的名称。
  • <api-version> 替换为 REST API 的版本号。
  • <api-key> 替换为 AI 搜索资源的访问密钥。 可以从 Azure 门户获取此密钥。

请求还必须包含如下所示的 JSON 正文:

{
  "text": "Test text to analyze.",
  "analyzer": "<analyzer name>"
}

<analyzer name> 替换为定义自定义分析器时指定的名称。 请务必使用许多不同的 text 值进行测试,直到确定自定义分析器的行为如同预期。

对字段使用自定义分析器

定义并测试自定义分析器后,可以将索引配置为使用它。 可以为索引中的每个字段指定分析器。

想要使用同一分析器进行索引和搜索时,可以使用 analyzer 字段:

"fields": [
 {
   "name": "IcelandicDescription",
   "type": "Edm.String",
   "retrievable": true,
   "searchable": true,
   "analyzer": "ContosoAnalyzer",
   "indexAnalyzer": null,
   "searchAnalyzer": null
 },

在为字段编制索引和搜索字段时,也可以使用其他分析器。 如果在为字段编制索引和分析查询时需要一组不同的处理步骤,请使用此配置:

"fields": [
 {
   "name": "IcelandicDescription",
   "type": "Edm.String",
   "retrievable": true,
   "searchable": true,
   "analyzer": null,
   "indexAnalyzer": "ContosoIndexAnalyzer",
   "searchAnalyzer": "ContosoSearchAnalyzer"
 },