「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」。
Elasticsearch---Analyzer(分析器)
什么是Analyzer
一个标准的分析器Analyzer由两部分组成,一部分是分词器,被称为Tokenizer;另一部分是过滤器,被称为TokenFilter。一个分析器Analyzer往往由一个分词器和多个过滤器组成。这里所说的过滤器,和检索时用的过滤器是完全不同的两个概念,这里所讲的过滤器是用于对用户切分出来的词进行一些处理,如去掉一些敏感词、停用词、大小写转换、单复数转换等等。
1 分析器的组成
1.1 normalization(标准定义器)
文档规范化,提高召回率,是配合分析器(analyzer)完成其功能的。
拼写错误、形容词、单复数、动词、大小写、分词、称谓等转换成标准词汇
1.2 字符过滤器(character filter)
分词之前的预处理,过滤无用字符,将原始文本作为字符流接收,并可以通过添加、删除或更改字符来转换流。比如去除 html 标签
- HTML Strip Character Filter: 剥离像<b>这样的HTML元素,并解码像&这样的HTML实体。
- Mapping Character Filter:映射字符筛选器用指定的替换项替换任何出现的指定字符串。
- Pattern Replace Character Filter:用指定的替换替换匹配正则表达式的任何字符。
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分词器,目前比较流行的中文分词器之一,简单,稳定,想要特别好的效果,需要自行维护词库,支持自定义词典。
-
安装和部署
- ik下载地址:github.com/medcl/elast…
- Github加速器:github.com/fhefh2015/F…
- 创建插件文件夹 cd your-es-root/plugins/ && mkdir ik
- 将插件解压缩到文件夹 your-es-root/plugins/ik
- 重新启动es
-
IK文件描述
- IKAnalyzer.cfg.xml:IK分词配置文件
- 主词库:main.dic
- 英文停用词:stopword.dic,不会建立在倒排索引中
- 特殊词库:
- quantifier.dic:特殊词库:计量单位等
- suffix.dic:特殊词库:行政单位
- surname.dic:特殊词库:百家姓
- preposition:特殊词库:语气词
- 自定义词库:网络词汇、流行词、自造词等
-
ik提供的两种analyzer:
- ik_max_word会将文本做最细粒度的拆分,比如会将“你是真的帅”拆分为“你是,真的,帅”,适合 Term Query;
- ik_smart: 会做最粗粒度的拆分,比如会将“高达玩具”拆分为“高达,玩具”,适合 Phrase 查询。
-
热更新
- 远程词库文件
- 优点:简单易用,支持自定义词典和远程词典
- 缺点:
- 词库的管理不方便,要操作直接操作磁盘文件,检索页很麻烦,词库需要自行维护,不支持词性识别
- 文件的读写没有专门的优化性能不好
- 多一层接口调用和网络传输
- ik访问数据库
- MySQL驱动版本兼容性
- 驱动下载地址
- 远程词库文件
2.10.2 Smart Chinese Analysis
官方提供的中文分析器,不好用
2.10.3 HanLP (推荐)
HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。
总结
本文写到这里就结束了,后续博主会不定时更新文章,欢迎指正。
著作权归NoLongerConfused所有。商业转载请联系NoLongerConfused获得授权,非商业转载请注明出处。