《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.5.中文分词器/ IK分词器/ pinyin分词器(上) https://developer.aliyun.com/article/1229402
IK 中文分词器
插件下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
(注意必须下载和使用的 Elasticsearch 匹配的版本)
1、执行插件安装命令:
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.0/elasticsearch-analysis-ik-7.10.0.zip
2、重启 ES 即生效
IK 分词器包含:ik_smart 以及 ik_max_word 2种分词器,都可以用在 索引和查询阶段。
创建一个索引,里面包含2个字段:
l - 字段 max_word_content 使用 ik_max_word 分词器处理;
l - 字段 smart_content 采用 ik_smart 分词器处理;
分别对比下执行结果:
#创建索引 PUT /analyze_chinese { "mappings": { "properties": { "max_word_content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" }, "smart_content": { "type": "text", "analyzer": "ik_smart", "search_analyzer": "ik_smart" } } } } #添加测试数据 POST analyze_chinese/_bulk {"index":{"_id":1}} {"max_word_content":"南京市长江大桥","smart_content":"我是南京市民"} # ik_max_word 查询分析器解析结果 POST _analyze { "text": "南京市长江大桥", "analyzer": "ik_max_word" } #返回结果 { "tokens" : [ { "token" : "南京市", }, { "token" : "南京", }, { "token" : "市长", }, { "token" : "长江大桥", }, { "token" : "长江", }, { "token" : "大桥", } ] } #ik_smart POST _analyze { "text": "南京市长江大桥", "analyzer": "ik_smart" } #返回结果 { "tokens" : [ { "token" : "南京市", }, { "token" : "长江大桥", } ] }
通过以上分析,ik_smart 显然分词的颗粒度较粗,而 ik_max_word 颗粒度较细。
通过 DSL 来验证查询
POST analyze_chinese/_search { "query": { "match": { "smart_content": "南京市" } } } #返回结果 "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }
未匹配到记录,因为“我是南京市民”经过分词处理后并不包含“南京市”的 token,那通过“南京”搜索呢?
POST analyze_chinese/_search { "query": { "match": { "smart_content": "南京" } } } #返回结果 "hits" : [ { "_source" : { "max_word_content" : "南京市长江大桥", "smart_content" : "我是南京市民" } } ]
经过 ik_max_word 分词处理器处理之后的 max_word_content 字段效果呢?
POST analyze_chinese/_search { "query": { "match": { "max_word_content": "南京" } } } #返回结果 "hits" : [ { "_source" : { "max_word_content" : "南京市长江大桥", "smart_content" : "我是南京市民" } } ] #使用 南京市 查询 POST analyze_chinese/_search { "query": { "match": { "max_word_content": "南京市" } } } #返回结果 "hits" : [ { "_source" : { "max_word_content" : "南京市长江大桥", "smart_content" : "我是南京市民" } } ]
可以看到,由于“南京市长江大桥”经过 ik_max_word 分词器处理后,包含“南京市”
token,所以都可以查询到。
IK 分词器总结:
l ik_max_word 分词颗粒度小,查全率高,满足业务场景更丰富
l ik_smart 分词器颗粒度较粗,满足查准要求高的业务
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.5.中文分词器/ IK分词器/ pinyin分词器(下) https://developer.aliyun.com/article/1229399