Elasticsearch之分词
分词
- 分词是指将文本装换成一系列单词(term or token)的过程,也可以叫做文本分析,在es里面称为Analysis,如下图所示:
- 分词器是es中专门处理分词的组件,英文为Analyzer,他的组成如下:
- Character Filter
- 针对原始文本进行处理,比如去除html特殊标记符
- Tokenizer
- 将原始文本按照一定规则切分为单词
- Token Filters
- 针对tokenizer处理的单词就行在加工,比如转小写、删除或新增等处理
Analyze API
- es提供了一个测试分词的api接口,方便验证分词效果,endpoint是_analyze
- 可以直接指定analyzer进行测试
- 可以直接指定索引中的字段进行测试
- 可以自定义分词器进行测试
自带(预定义)的分词器
- es自带如下的分词器
- Standard
- Simple
- Whitespace
- Stop
- Keyword
- Pattern
- Language
- Standard Analyzer
- 默认分词器
- 其组成如图,特性为:
- 按词切分,致辞多语言
- 小写处理 - Simple Analyzer
- 器组成如图,特性为:
- 按照字母切分
- 小写处理 - Whitespace Analyzer
- 其组成如图,特性为:
- 按照空格切分 - Stop Analyzer
- Stop Word 指武器助词等修饰性的词语,比如the、an、这等等
- 其组成如图,特性为:
- 相比Simple Anlyzer 多了Stop Word 处理 - Keyword Analyzer
- 器组成如图,特性为:
- 不分词,直接将输入作为一个单词输出
-
- 器组成如图,特性为:
- Pattern Analyzer
- 其组成如图,特性为:
- 通过正则表达式自定义分隔符
- 默认是\W+,即非字词的符号作为分隔符
- 其组成如图,特性为:
- Language Analyzer
- 提供30+常见语言的分词器
中文分词
- 常用分词系统
- IK
- 实现中英文单词的切分,支持ik_smart、ik_maxword等模式
- 可自定义词库,支持热更新分词字典
- https://github.com/medcl/elasticsearch-analysis-ik - jieba
- python 中最流行的分词系统,支持分词和词性标注
- 支持繁体分词。自定义词典,并行分词等
- https://github.com/huaban/elasticsearch-analysis-jieba - 基于自然语言处理的分词系统
- Hanlp
- 由一系列模型与算法组成的java工具包,目标是普及自然语言处理在生产环境中的应用
- https://github.com/hankcs/HanLP
- THULAC
- THULAC (THU Lexical Analyzer for Chinese) 是由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。
- https://github.com/microbun/elasticsearch-thulac-plugin
自定义分词
- 当自带的分词无法满足需求时,可以自定义分词
- 通过自定义 Character Filters、 Tokenizer和 Token Filter实现 - Character Filters
- 在Tokenizer之前对原始文本进行处理,比如增加、删除或替换字符等
- 自带的如下:
- HTML Strip 去除html标签和转化html实体
- Mapping 进行字符替换操作
- Pattern Replace 进行正则匹配替换
- 会影响后续 tokenizer解析的postion和offset信息 - Tokenizer
- 将原始文本按照一定规则切分为单词(term or token)
- 自带的如下:
- standard 按照单词进行分割
- letter 按照非字符类进行分割
- whitespace 按照空格进行分割
- UAX URL Email 按照standard分割,但不会分割邮箱和url
- NGram 和 Edge NGram 连词分割
- Path Hierachy 按照文件路径进行切割 - Token Filters
- 对于tokenizer输出的单词(term)进行增加删除、修改等操作
- 自带如下:
- lowercase 将所有term装换为小写
- stop删除stop word
- NGram 和 Edge NGram 连词分割
- Synonym添加近义词的term
- 自定义分词的api
- 我们自定义入选图所示的分词器
- 自定义分词器验证
分词使用说明
-
分词会在如下两个时机使用:
- 创建或者更新文档是(Index Time), 会对相应的文档进行分词处理
- 查询是(Search Time),会对查询语句进行分词 -
索引是分词是通过配置Index Mapping中每个字段的analyzer属性实现的,如下:
- 不指定分词时,使用默认standard -
查询是分词的指定方式有人如下几种:
- 查询的时候通过analyzer指定分词器
- 通过index mapping 设置search_analyzer -
一般不需要特别指定查询时分词器,直接使用索引时分词器即可,否则会出现无法匹配的情况
分词的使用建议
- 明确字段是否需要分词,不需要分词的字段就将type设置为可以keyword,可以节省空间和提高性能
- 善用_analyze API, 查看文档的具体分词结果
- 动手测试