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.1、5.6.2、5.6.3这3个版本。
wget https://github.com/yejingtao/forblog/blob/master/ik/elasticsearch-analysis-ik-5.6.1.zip
unzip elasticsearch-analysis-ik-5.6.1.zip
解压后目录结构如下
这些.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"
OK到此为止,中文分词的ik插件已经安装和配置完毕,下面我们开始验证ik的效果,为了做对比我打算创建3个索引,index_ik_s使用ik_smart解析,index_ik_m使用ik_max_word解析,index_stan使用standard解析。我们将相同的数据插入做下比对。
Standard分词结果在前面“我是三好学生”中已经有了大致的理解,而ik又分为ik_smart和ik_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:这里一定要搞清楚,虽然standard和max_word都可以搜索得到,但是存储的反向索引和搜索时语法解析是完全不同的。
案例中也给了英文的例子,大家可以自己试试,ik_smart和ik_max_word对英文的分词不比standard差多少,个人觉得完全可以胜任。
对比后我们的结论是:ik_smart既能满足英文的要求,又更智能更轻量,占用存储最小,所以首推ik_smart;standard对英语支持是最好的,但是对中文是简单暴力每个字建一个反向索引,浪费存储空间而且效果很差;ik_max_word比ik_smart对中文的支持更全面,但是存储上的开销实在太大,不建议使用。
- ElasticSearch中文检索支持-ik插件
- Elasticsearch安装中文分词插件ik
- Elasticsearch安装中文分词插件ik
- Elasticsearch安装中文分词插件ik
- ElasticSearch增加ik中文分词插件
- Elasticsearch中文分词插件ik的安装
- Elasticsearch如何安装中文分词插件ik
- Elasticsearch如何安装中文分词插件ik
- Elasticsearch的中文分词插件ik
- Elasticsearch中文分词ik插件安装
- 安装Elasticsearch analysis ik中文分词插件
- Elasticsearch安装中文分词插件ik
- 全文检索elasticsearch和IK中文分词器
- elasticsearch 配置 JDBC数据源与IK中文分词插件
- elasticsearch 配置 JDBC数据源 与IK 中文分词插件
- elasticsearch 2.3.4中文分词插件ik 1.9.4安装
- Elasticsearch中文分词插件IK Analyer安装操作指导
- ELK第三篇:Elasticsearch安装IK中文分词插件
- 2018世界十大技术发展趋势:AI成为基础、从云到边缘概念兴起
- vuejs及相关工具介绍
- LA 4513 Stammering Aliens(字符串hash)
- 模板:强连通分量和缩点
- Android Toolbar样式定制详解
- ElasticSearch中文检索支持-ik插件
- Java
- 栈 洛谷p1044
- 调整Hyperion Planning 作业控制台日志保留期限
- java常用类库---正则表达式
- Vue.js开发环境搭建的介绍
- 把自己坑的Could not invoke service..
- 数据中心标准旨在实现OCP未能实现的功能
- mysql计算两个日期之间的时间差