一ElasticSearch安装中文分词器
1.1 gitclone https://github.com/medcl/elasticsearch-analysis-ik
1.2 gitcheckout tags/v5.2.0
1.3 mvnpackage
1.4将target/releases/elasticsearch-analysis-ik-5.2.0.zip拷贝到
ES/plugins/ik目录下
1.5 在ES/plugins/ik下对elasticsearch-analysis-ik-5.2.0.zip进行解压缩
1.6 重启ES
二 IK分词器的基础
2.1ik_max_word
会将文本做最细粒度的拆分
POST /ecommerce/_analyze
{
"text":"深秋嫩绿的垂柳",
"analyzer":"ik_max_word"
}
它会拆分成"深秋","嫩绿","垂柳","绿","垂","柳"
2.2ik_smart
会做最粗粒度的拆分
POST /ecommerce/_analyze
{
"text":"深秋嫩绿的垂柳",
"analyzer":"ik_smart"
}
"深秋","嫩绿","垂柳"
三 IK分词器的使用
3.1 首先建立映射
PUT/ecommerce
{
"mappings": {
"music":{
"properties": {
"brand": {
"type":"text",
"analyzer":"ik_max_word",
"fields": {
"keyword": {
"type":"keyword",
"ignore_above": 256
}
}
},
"desc": {
"type":"string",
"analyzer":"ik_max_word",
"fields": {
"keyword": {
"type":"keyword",
"ignore_above": 256
}
}
},
"sales":{
"type":"long"
},
"price":{
"type":"float"
},
"review":{
"type":"integer"
},
"color":{
"type":"string",
"analyzer":"ik_max_word",
"fields": {
"keyword": {
"type":"keyword",
"ignore_above": 256
}
}
},
"origin":{
"type":"string",
"analyzer":"ik_max_word",
"fields": {
"keyword": {
"type":"keyword",
"ignore_above": 256
}
}
},
"c_date":{
"type":"date"
}
}
}
}
}
3.2 然后添加数据
PUT /ecommerce/music/1
{
"brand":"雅马哈",
"desc":"正品YAMAHA雅马哈F310 F600初学者入门男女学生民谣木吉他 41寸",
"color":"红",
"origin":"美国",
"sales":1914,
"price":799.00,
"review":786,
"c_date":"2015-12-21"
}
PUT /ecommerce/music/2
{
"brand":"雅马哈",
"desc":"雅马哈FG800单板民谣木吉他 FGX800C电箱吉他FG700S升级41/40寸",
"color":"黄",
"origin":"美国",
"sales":102,
"price":1590.00,
"review":349,
"c_date":"2016-09-12"
}
3.3 分词分析
POST /ecommerce/_analyze
{
"text":"美德威MP2000X智能电钢琴88键重锤成人电子钢琴家用数码电钢专业",
"analyzer":"ik_max_word"
}
3.4 查询数据
POST /ecommerce/music/_search
{
"query":{
"match": {
"desc":"罗兰"
}
}
}
POST /ecommerce/music/_search
{
"query":{
"constant_score": {
"filter": {
"term":{
"desc":"吉他"
}
}
}
}
}
四 配置IK
IK默认提供的很多分词,并不能满足我们所有的情况,不同公司,可能都有自己的数据,而且还有一些最近流行的一些新词也是没有。所以这就需要我们更新词库
我们首先需要进到IK的config目录,有一个IKAnalyzer.cfg.xml的配置文件
main.dic:ik原生内置的中文词库
quantifier.dic:放了一些单位相关的词
suffix.dic:放了一些后缀
surname.dic:中国的姓氏
stopword.dic:英文停用词
在custom目录下也放了些词库
ext_stopword.dic:扩展的停用词,我们可以用来添加中文停用词
五 IK词库的热更新
我们如果每次需要手动去更新词库,每次都要重启ElasticSearch,如果集群数量太多,比如几百台 怎么去弄,所以我们有必要再不重启ElasticSearch的情况下热更新
5.1热更新的方案
# 修改ik分词器源码,然后手动支持从mysql中每隔一定时间,自动加载新的词库
# 基于ik分词器原生支持的热更新方案,部署一个web服务器,提供一个http接口,通过modified和tag两个http响应头,来提供词语的热更新
一般公司都会采用第一种,第二种官方都不建议,因为不稳定
核心思想就是不停的reload你想更新的词典文件,比如ext_stop.dic或者main.dic,然后读取数据库里面的配置更新。
5.2 热更新代码