Skip to main content

了解用于文本处理的分析器

分类:  Azure搜索 标签:  #Azure #Search #认知搜索 发布于: 2023-06-12 20:06:52

分析器是全文搜索的重要概念,它既可以用于生成索引,也可以用于分析用户输入的查询词,经过转换或者分解之后对新的查询词进行标记,并返回查询树,主要可能会有如下的操作:

  • 删除非必须字和标点。
  • 将短语和用连字符链接的词语拆分为组成部分
  • 将大写单词转换为小写单词
  • 将单词分解为词根用以提高存储效率,方便找到匹配项。

在使用C#的SDK的时候,分析器适用于被标记为"可搜索"的字段属性上,表示全文搜索。

例如:

[SearchableField(IsSortable = true)]
public string HotelName { get; set; }

[SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnMicrosoft)]
public string Description { get; set; }

[SearchableField(AnalyzerName = LexicalAnalyzerName.Values.FrLucene)]
[JsonPropertyName("Description_fr")]
public string DescriptionFr { get; set; }

而且它的类型还必须是Edm.String

注意
非全文搜索的查询类型,不会在查询阶段经历分析阶段。

默认的分析器

在查询中, Azure认知搜索服务分析器回自动调用标记为SearchableField的所有字符串字段,所以必须记得起可搜索的字段必须是文本类型的。

Azure认知搜索服务默认使用Apache Lucene的标准分析器。Azure认知搜索服务一共提供了如下几种分析器:

  • 标准的Lucene分析器:这个是默认的分析器。很通用,适合大多数的场景。
  • 内置分析器: 内置分析器分语言和不限语言两种。如果需要为语言找到特定的分析器,您可以参考:https://docs.microsoft.com/zh-cn/azure/search/index-add-language-analyzers
  • 自定义分析器: 必须包含一个tokenzier和可选的筛选器。

如何指定分析器

有两种办法:

  • 在输入时用参数: analyzer 来设置内置分析器,语言分析器,或者自定义的分析器,另外需要注意的是如果使用的是语言分析器,那么必须用analyzer属性来进行设定。
  • 设置属性indexAnalyzersearchAnalyzer, 设定好了这两个值之后, 属性analyzer就需要设为null

什么时候添加分析器

一般建议开发阶段就加入分析器。

C# 实例

分配语言分析器, 直接看代码吧。

public partial class Hotel
    {
       . . . 
        [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnLucene)]
        public string Description { get; set; }

        [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.FrLucene)]
        [JsonPropertyName("Description_fr")]
        public string DescriptionFr { get; set; }

        [SearchableField(AnalyzerName = "url-analyze")]
        public string Url { get; set; }
      . . .
    }