笔记六:通过 Analyzer 进行分词
Anaiysis 与 Analyzer
- Analysis - 文本分析是吧全文本转换成一系列的单词(term / token)的过程,也叫分词
- Analysis 是通过Analyzer来实现的
- 可使用Elasticesearch 内置的分析器 或者按需求定制化分析器
- 除了在数据写入时转换词条,匹配Query语句时候也需要用相同的分析器会查询语句进行分析
Analyzer 的组成
- 分词器是专门处理分词的组件,Analyzer 由三部分组成
- Character Filters (针对原始文本处理,例如去除html)
- Tokenizer(按照规则切分为单词)
- Token Filter (将切分的单词进行加工,小写,删除stopwords,增加同义语)
Elastocsearch 的内置分词器
- Standard Analyzer - 默认分词器,按词切分,小写处理
- Simple Analyzer - 按照非字母切分(符号被过滤),小写处理
- Stop Analyzer - 小写处理,停用词过滤(the ,a,is)
- Whitespace Analyzer - 按照空格切分,不转小写
- Keyword Analyzer - 不分词,直接将输入当做输出
- Patter Analyzer - 正则表达式,默认 \W+
- Language - 提供了30多种常见语言的分词器
- Customer Analyzer 自定义分词器
使用 _analyzer Api
- 直接指定Analyzer 进行测试
GET _analyze { "analyzer": "standard", "text" : "Mastering Elasticsearch , elasticsearch in Action" } //返回结果 { "tokens" : [ { "token" : "mastering", "start_offset" : 0, "end_offset" : 9, "type" : "<ALPHANUM>", "position" : 0 }, { "token" : "elasticsearch", "start_offset" : 10, "end_offset" : 23, "type" : "<ALPHANUM>", "position" : 1 }, { "token" : "elasticsearch", "start_offset" : 26, "end_offset" : 39, "type" : "<ALPHANUM>", "position" : 2 }, { "token" : "in", "start_offset" : 40, "end_offset" : 42, "type" : "<ALPHANUM>", "position" : 3 }, { "token" : "action", "start_offset" : 43, "end_offset" : 49, "type" : "<ALPHANUM>", "position" : 4 } ] }
指定索引的字段进行测试
POST books/_analyze { "field": "title", "text": "Mastering Elasticesearch" }
自定义分词进行测试
POST /_analyze { "tokenizer": "standard", "filter": ["lowercase"], "text": "Mastering Elasticesearch" } //结果返回 { "tokens" : [ { "token" : "mastering", "start_offset" : 0, "end_offset" : 9, "type" : "<ALPHANUM>", "position" : 0 }, { "token" : "elasticesearch", "start_offset" : 10, "end_offset" : 24, "type" : "<ALPHANUM>", "position" : 1 } ] }
Standard Analyzer
- 默认的分词器
- 按词切分
- 小写处理
#standard GET _analyze { "analyzer": "standard", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
Simple Analyzer
- 按照非字母切分,非字母的都被去除
- 小写处理
#simple 去除非字母的 :2 - xi GET _analyze { "analyzer": "simple", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
Whitespace Analyzer
- 空格切分
#stop GET _analyze { "analyzer": "whitespace", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
Stop Analyzer
- 相比 Simple Analyzer
- 多了stop filter
- 后把 the ,a, is,in 等修饰性词语去除
GET _analyze { "analyzer": "stop", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
- 后把 the ,a, is,in 等修饰性词语去除
Keyword Analyzer
- 不分词,直接将输入当作一个term输出
#keyword GET _analyze { "analyzer": "keyword", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
Pattern Analyzer
- 通过正则表达进行分词
- 默认是\W+,非字符的符号进行分隔
GET _analyze { "analyzer": "pattern", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
Language Analyzer
- 各国语言分词
#english GET _analyze { "analyzer": "english", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
中文分词的难点
- 中文句子,切分成一个一个次(不是一个个字)
- 英文中,单词有自然的空格作为分隔
- 一句中文,在不同的上下文,有不同的理解
- 这个苹果,不大好吃 / 这个苹果,不大,好吃!
- 一些例子
- 他说的确实在理 / 这事的确定不下来
ICU Analyzer
- 需要安装plugin
- Elasticsearch-plugin install analysis
- 提过了Unicode的支持,更好的支持亚洲语言!
给docker-compose安装的es安装插件
cd /var/docker/docker-es-7.3/
docker exec -it es7_01 bash
bin/elasticsearch-plugin install analysis-icu
exit
docker exec -it es7_02 bash
bin/elasticsearch-plugin install analysis-icu
exit
docker-compose restart
#icu analyzer
POST _analyze
{
"analyzer": "icu_analyzer",
"text": "他说的确实在理”"
}
更多的中文分词器
- IK
- 支持自定义词库,支持热更新分词字典
- https://github.com/medcl/elasticsearch-ana...
- THULAC
- THU Lexucal Analyzer for Chinese,清华大学自然语言处理和社会人文计算实验室的一套中文分词器
- https://github.com/microbun/elasticearch-t...
本作品采用《CC 协议》,转载必须注明作者和本文链接