Elasticsearch---Analyzer(分析器)

469 阅读6分钟

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」。

Elasticsearch---Analyzer(分析器)


什么是Analyzer

一个标准的分析器Analyzer由两部分组成,一部分是分词器,被称为Tokenizer;另一部分是过滤器,被称为TokenFilter。一个分析器Analyzer往往由一个分词器和多个过滤器组成。这里所说的过滤器,和检索时用的过滤器是完全不同的两个概念,这里所讲的过滤器是用于对用户切分出来的词进行一些处理,如去掉一些敏感词、停用词、大小写转换、单复数转换等等。

1 分析器的组成

1.1 normalization(标准定义器)

文档规范化,提高召回率,是配合分析器(analyzer)完成其功能的。

拼写错误、形容词、单复数、动词、大小写、分词、称谓等转换成标准词汇

1.2 字符过滤器(character filter)

分词之前的预处理,过滤无用字符,将原始文本作为字符流接收,并可以通过添加、删除或更改字符来转换流。比如去除 html 标签

1.3 令牌过滤器(token filter)

停用词、时态转换、大小写转换、同义词转换、语气词处理等。

1.4 分词器(tokenizer):

切词,按照规则切分为单词,比如按照空格切分

2 常见分析器:

2.1 Standard Analyzer

组成:Standard Tokenizer、Lower Case Token Filter和Stop Token Filter (默认禁用)

默认分析器,按照Unicode文本分割算法所定义的词边界将文本拆分成若干词项。它删除大多数标点符号,小写项,并支持删除停止词。 提供基于语法的标记,适用于大部分语言,但是对中文支持的不理想,会逐字拆分,按词切分。

2.2 Simple Analyzer

组成:只有分词器Lowercase Tokenizer而无过滤器

当遇到非字母的字符时,简单分析器将文本拆分成若干词项。所有项都是小写的。

2.3 Stop Analyzer

组成:Lowercase Tokenizer和Stop Token Filter

和Simple Analyzer相比多了基于所提供的停用词(stop word)过滤数据的功能,停用词指语气助词等修饰性词语。

2.4 Pattern Analyzer

组成:Pattern Tokenizer、Lowercase Token Filter和Stop Token Filter(默认禁用)

以正则匹配分隔符,把文本拆分成若干词项,默认是\W+,即非字词的符号作为分隔符。

2.5 Language Analyzers

组成:Stopwords、Excluding words from stemming和Reimplementing language analyzers

一组用于分析特定语言文本的分析器。 支持以下类型:阿拉伯语,亚美尼亚语,巴斯克语,孟加拉语,巴西语,保加利亚语,加泰罗尼亚语,cjk,捷克语,丹麦语,荷兰语,英语,爱沙尼亚语,芬兰语,法语,加利西亚语,德语,希腊语,印度语,匈牙利语,印度尼西亚语,爱尔兰语,意大利语,拉脱维亚语,立陶宛语,挪威语,波斯语,葡萄牙语,罗马尼亚语,俄罗斯,索拉尼语,西班牙语,瑞典语,土耳其语,泰国语。 以正则匹配词项,速度比pattern tokenizer快。

2.6 Whitespace Analyzer

组成:Whitespace Tokenizer

在处理文本时以空格字符为区分进行分词,该分词器在中文分词上基本不被使用

2.7 Keyword Analyzer

组成:Keyword Analyzer

不分词,直接将输入作为一个单词输出。

2.8 Fingerprint Analyzer

组成:Standard Tokenizer、Lower Case Token Filter、ASCII folding、Stop Token Filter (默认禁用)和Fingerprint

很特殊的一种分析器,输入文本较低,规范化以删除扩展字符,排序,重复数据删除并连接到单个令牌。 如果配置了一个停用词列表,停止单词也将被删除。

2.9自定义分析器:custom analyzer

当内置分析器不能满足您的需求时,您可以创建一个custom分析器,它使用以下相应的组合:

  • 零个或多个字符过滤器
  • 一个分析器
  • 零个或多个token过滤器

分析器接受以下的参数:

  • char_filter:内置或自定义字符过滤器 。
  • token filter:内置或自定义token filter 。
  • tokenizer:内置或自定义分词器。
  • position_increment_gap:在索引文本值数组时,Elasticsearch会在一个值的最后一个值和下一个值的第一个项之间插入假的“间隙”,以确保短语查询与不同数组元素的两个术语不匹配。 默认为100。

2.10 中文分析器

2.10.1 IK Analyzer (使用频率很高的,对搜索要求不高的建议选用)

免费开源的java分词器,目前比较流行的中文分词器之一,简单,稳定,想要特别好的效果,需要自行维护词库,支持自定义词典。

  1. 安装和部署

  2. IK文件描述

    • IKAnalyzer.cfg.xml:IK分词配置文件
  • 主词库:main.dic
    • 英文停用词:stopword.dic,不会建立在倒排索引中
    • 特殊词库:
      • quantifier.dic:特殊词库:计量单位等
      • suffix.dic:特殊词库:行政单位
      • surname.dic:特殊词库:百家姓
      • preposition:特殊词库:语气词
    • 自定义词库:网络词汇、流行词、自造词等
  1. ik提供的两种analyzer:

    1. ik_max_word会将文本做最细粒度的拆分,比如会将“你是真的帅”拆分为“你是,真的,帅”,适合 Term Query;
    2. ik_smart: 会做最粗粒度的拆分,比如会将“高达玩具”拆分为“高达,玩具”,适合 Phrase 查询。
  2. 热更新

    1. 远程词库文件
      1. 优点:简单易用,支持自定义词典和远程词典
      2. 缺点:
        1. 词库的管理不方便,要操作直接操作磁盘文件,检索页很麻烦,词库需要自行维护,不支持词性识别
        2. 文件的读写没有专门的优化性能不好
        3. 多一层接口调用和网络传输
    2. ik访问数据库
      1. MySQL驱动版本兼容性
        1. dev.mysql.com/doc/connect…
        2. dev.mysql.com/doc/connect…
      2. 驱动下载地址
        1. mvnrepository.com/artifact/my…

2.10.2 Smart Chinese Analysis

官方提供的中文分析器,不好用

2.10.3 HanLP (推荐)

HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。

总结

本文写到这里就结束了,后续博主会不定时更新文章,欢迎指正。

著作权归NoLongerConfused所有。商业转载请联系NoLongerConfused获得授权,非商业转载请注明出处。