ElasticSearch ik分词器
中文分词器
-
es本身对中文分词比较局限,内置的标准分词器只是简单地将中文的每一个汉字作为一个词token分开,可通过以下方法查看效果:
http://192.168.19.130:9200/_analyze?analyzer=standard&pretty=true&
text=Elasticsearch分词插件的安装//结果:
Elasticsearch 分 词 插 件 的 安 装 -
虽然可以保证查全率100%,但是查准率非常低,所以有必要引入其他的分词方法。
-
elastic的中文分词我们采用ik分词,ik分词有两种分词模式,ik_max_word和ik_smart。
- ik_max_word:将文本做最细粒度的拆分,如,将“*国歌”拆分为*、中华人民、中华、华人、人民*、人民、人、民、*、共和、和、国、国歌,会穷尽所有可能组合,如,南京东路被拆分为南京东路 南京 京东 东路。
- ik_smart:做最粗粒度的拆分,如,将“*国歌”拆分为*、国歌。
-
遇到英文时,利用空格和标点将英文单词提取出来,同时转为小写,和真正的英文分词还差一个词干提取功能,比如,i like cats,只能分词出cats,而不能回溯为词干cat。因此我们可以自定义一个分析器:
{
“settings”: {
“analysis”: {
“analyzer”: {
“optimizeIK”: {
“type”: “custom”,
“tokenizer”: “ik”,
//增加一个词干提取过滤器,类似的还有snowball
“filter”: [
“stemmer”
]
}
}
}
}
} -
遇到拼音时,不会分词,如,woaizhongguo分词还是woaizhongguo。
-
索引时,为了提高索引的覆盖范围,通常会采用ik_max_word分析器,搜索时,为了提高搜索准确度,会采用ik_smart分析器。
-
中文分词能解决的问题:
-
当搜索关键词如:“人民币”时,如果分词将“人民币”分成“人”,“民”,“币”三个单字,那么搜索该关键词会匹配到很多包含该单字的无关内容,但是如果将该词分词成一个整词“人民币”,搜索单字如“人”字又不会匹配到包含“人民币”关键词的内容,怎么解决这个问题,既保证覆盖度又保证准确度?
-
搜索“RMB”时只会匹配到包含“RMB”关键词的内容,实际上,“RMB”和“人民币”是同义词,我们希望用户搜索“RMB”和“人民币”可以相互匹配,ES同义词怎么配置?
-
用户搜索拼音: 如"baidu",或者拼音首字母"bd",怎么匹配到"百度"这个关键词,又如用户输入"摆渡"这个词也能匹配到"百度"关键词,中文拼音匹配怎么做到?
-
怎么保证搜索关键词被正确分词,通常我们会采用自定义词典来做,那么怎么获取自定义词典?
-
安装中文分词插件ik:
-
安装插件
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/ elasticsearch-analysis-ik-5.5.1.zip
- 版本为5.5.1,适用当前elastic版本。
- 重启elastic,就会自动加载这个新安装的插件。