ElasticSearch中文检索支持-ik插件

来源:互联网 发布:大数据用什么数据库 编辑:程序博客网 时间:2024/06/06 05:34

在前面博文中我们已经了解到,ElasticSearch是基于Lucene的搜索引擎,搜索原理见《Lucene原理分析》,其中分词部分会因为语言的不同存在很大的差异。

 

英文的分词相对简单,因为英语单词之间是通过空格分隔开的,这就具备了先天上的优势,剩下的工作只需要做些助词剔除、时态单复数转化就可以了。虽然汉字没有单复数的区别,省去了一部分转化的开销,但是汉字的字和词在书写时是没有任何物理上的分割能力的,完全要靠语境进行“智能”的推测。

例如“我是三好学生”,按ES自带standard的分割方式可能会拆成“我”、“三”、“好”、“学”、“生”,因为不经过语句推测是不知道哪几个字组成一个分词,而这样的分词对于我们应用来说是没有任何意义的。

所以在创建反向索引和进行搜索时需要对中文分词进行一些特殊的处理,在ElasticSearch中是通过插件的形式实现的。

 

下载elasticsearch ik插件,需要与你安装的elasticsearch版本对应,因为我的es用的是5.6.1版本,所以我的ik也要用5.6.1版本。Ik的插件包我在git上上传了1份,git上有5.6.15.6.25.6.33个版本。

wget https://github.com/yejingtao/forblog/blob/master/ik/elasticsearch-analysis-ik-5.6.1.zip

unzip elasticsearch-analysis-ik-5.6.1.zip

解压后目录结构如下

这些Jar包是工具类,进入到config中看下

这些.dic文件是词库文件。

unzip elasticsearch-analysis-ik-5.6.1.zi解压后所有的内容拷贝到elasticsearch_root/plugins/ik目录下(ik需要自己手动创建)

启动elasticsearch,可以正常启动,说明至少到目前为止是成功的。

PS:我这里按照网上给的攻略在config/elasitcsearch.yml中添加配置:

index.analysis.analyzer.default.type:"ik"

这个在新版本的ES中已经不需要了,添加了启动时反而会报错,ES5.X版本不再通过elasitcsearch.yml配置设置分词规则,而是在创建索引时指定。

 

OK到此为止,中文分词的ik插件已经安装和配置完毕,下面我们开始验证ik的效果,为了做对比我打算创建3个索引,index_ik_s使用ik_smart解析,index_ik_m使用ik_max_word解析,index_stan使用standard解析。我们将相同的数据插入做下比对。

Standard分词结果在前面“我是三好学生”中已经有了大致的理解,而ik又分为ik_smartik_max_word两种,从名称中也可以看得出smart是智能解析,最贴近我们使用规则,max_word解析是在smart基础上添加了更多的冗余和交集。用下面的例子感受下区别。

创建个索引index

curl -XPUThttp://192.168.226.132:9200/index

分别试下3种解析

curl 'http://192.168.226.132:9200/index/_analyze?analyzer=ik_max_word&pretty=true'-d '  
{ 
"text":"
世界如此之大,我想去看看" 
}'

 

curl 'http://192.168.226.132:9200/index/_analyze?analyzer=ik_smart&pretty=true'-d '  
{ 
"text":"
世界如此之大,我想去看看" 
}'

curl 'http://192.168.226.132:9200/index/_analyze?analyzer=standard&pretty=true'-d '  
{ 
"text":"
世界如此之大,我想去看看" 
}'


 

我们来个更贴近实战的例子,再加深下理解:

1,创建索引

curl -XPUT http://192.168.226.132:9200/index_ik_scurl -XPUT http://192.168.226.132:9200/index_ik_mcurl -XPUT http://192.168.226.132:9200/index_stan

 

2,设置分析器

curl -XPOST http://192.168.226.132:9200:9200/index_ik_s/resource/_mapping -d'{        "properties": {            "content": {                "type": "text",                "analyzer": "ik_smart",                "search_analyzer": "ik_smart"            }        }    }'curl -XPOST http://192.168.226.132:9200:9200/index_ik_m/resource/_mapping -d'{        "properties": {            "content": {                "type": "text",                "analyzer": "ik_max_word",                "search_analyzer": "ik_max_word"            }        }    }'curl -XPOST http://192.168.226.132:9200:9200/index_stan/resource/_mapping -d'{        "properties": {            "content": {                "type": "text",                "analyzer": "standard",                "search_analyzer": "standard"            }        }    }'


3,插入验证数据

curl -XPOST http://192.168.226.132:9200:9200/index_ik_s/resource/1 -d'{"content":"上海牛人科技有限公司"}'curl -XPOST http://192.168.226.132:9200:9200/index_ik_s/resource/2 -d'{"content":"上海牛人科技有限公司,牛人聚集的地方"}'curl -XPOST http://192.168.226.132:9200:9200/index_ik_s/resource/3 -d'{"content":"最牛的人所在的地方,上海牛人科技有限公司"}'curl -XPOST http://192.168.226.132:9200:9200/index_ik_s/resource/4 -d'{"content":" This is an English test case"}'curl -XPOST http://192.168.226.132:9200:9200/index_ik_s/resource/5 -d'{"content":" English Test Case"}'curl -XPOST http://192.168.226.132:9200:9200/index_ik_m/resource/1 -d'{"content":"上海牛人科技有限公司"}'curl -XPOST http://192.168.226.132:9200:9200/index_ik_m/resource/2 -d'{"content":"上海牛人科技有限公司,牛人聚集的地方"}'curl -XPOST http://192.168.226.132:9200:9200/index_ik_m/resource/3 -d'{"content":"最牛的人所在的地方,上海牛人科技有限公司"}'curl -XPOST http://192.168.226.132:9200:9200/index_ik_m/resource/4 -d'{"content":" This is an English test case"}'curl -XPOST http://192.168.226.132:9200:9200/index_ik_m/resource/5 -d'{"content":" English Test Case"}'curl -XPOST http://192.168.226.132:9200:9200/index_stan/resource/1 -d'{"content":"上海牛人科技有限公司"}'curl -XPOST http://192.168.226.132:9200:9200/index_stan/resource/2 -d'{"content":"上海牛人科技有限公司,牛人聚集的地方"}'curl -XPOST http://192.168.226.132:9200:9200/index_stan/resource/3 -d'{"content":"最牛的人所在的地方,上海牛人科技有限公司"}'curl -XPOST http://192.168.226.132:9200:9200/index_stan/resource/4 -d'{"content":" This is an English test case"}'curl -XPOST http://192.168.226.132:9200:9200/index_stan/resource/5 -d'{"content":" English Test Case"}'


4,测试验证和对比

先测下他们对中文标准单词的支持,查询“科技”,3种索引效果都一样的,都能胜任,只是打分有细微的差距。

再测试下非标准的搜索,搜索“海牛”,

ik_smart搜索不出结果,因为在smart的反向索引中分词是“上海”“牛人”

ik_max_word搜索得到结果,因为在maxword的反向索引中“上海”、“牛人”、“海牛”这些都有分词。

Stardard可以搜索的到结果,因为startard的反向索引中每个字都拆分成一个分词“海”“牛”,在搜索时又将每个字都拆成一个检索条件,所以查询得到。

PS:这里一定要搞清楚,虽然standardmax_word都可以搜索得到,但是存储的反向索引和搜索时语法解析是完全不同的。

 

案例中也给了英文的例子,大家可以自己试试,ik_smartik_max_word对英文的分词不比standard差多少,个人觉得完全可以胜任。

 

对比后我们的结论是:ik_smart既能满足英文的要求,又更智能更轻量,占用存储最小,所以首推ik_smartstandard对英语支持是最好的,但是对中文是简单暴力每个字建一个反向索引,浪费存储空间而且效果很差;ik_max_wordik_smart对中文的支持更全面,但是存储上的开销实在太大,不建议使用。


原创粉丝点击