1、IK的介绍
Elasticsearch IK分析器外挂是国内非常著名的开源中文分析器外挂,它是基于国人所开发的另一款基于Luence 的IK分词器做的扩充套件,以达到对Elasticsearch的支援。Elasticsearch IK分词器是Java语言编写的,在Elasticsearch 0.16的时候就已经开始对其支援了,涵盖了Elasticsearch后续各版本的支援。
它包括了ik_smart和ik_max_word两种分析器,包括了与两种分析器对应的分词器ik_smart和ik_max_word,ik_smart和ik_max_word两种分析器的区别如下:
ik_smart:ik_smart的分词的粒度比较粗,适合于基本Phrase的查询,如会把“中华人民共和国”只拆分成“中华人民共和国”;
ik_max_word:ik_max_word的拆分就会很细,会穷尽所有的可能,以便于查询到最多的结果,适合于Term Query,同样的对“中华人民共和国”进行分词,它会拆分成“中华人民共和国,中华人民,中华,华人,人民共和国,人民,共和国,共和,国”;
2、IK的安装
IK的专案托管在Github上,专案地址为:
https://github.com/medcl/elasticsearch-analysis-ik
IK的版本从5.x开始就和Elasticsearch的版本是一一对应的了,如下所示:
Elasticsearch版本
IK版本
安装的时候一定要选与当前Elasticsearch版本一致的版本,因为每个版都可能会涉及到功能实现上的修改,以避免版本上的不一致出现的问题。
IK的安装方式有两种(也可以下载源代码自己编译),针对5.5.1以前的版本,只能够将IK下载到Elasticsearch的plugins目录中,5.5.1过后的版本,支援通过Elasticsearch的外挂安装命令进行安装,如下所示7.0.0的安装命令:
$ ./bin/elasticsearch-plugin install
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.0.0/elasticsearch-analysis-ik-7.0.0.zip
安装完成后,需要重新启动整个丛集。如果安装正常,会在Elasticsearch的启动控制台可以看到如下日志的输出:
loaded plugin [analysis-ik]
...
try load config from $ES_HOME/config/analysis-ik/IKAnalyzer.cfg.xml
try load config from $ES_HOME/plugins/ik/config/IKAnalyzer.cfg.xml
说明IK被成功载入。其中显示两次配置档案的载入,表示IK会从这两个位置载入配置档案,首先去Elasticsearch的配置档案所在目录载入:
$ ES_HOME/config/analysis-ik/IKAnalyzer.cfg.xml
如果没有载入成功,则从IK的安装目录进行载入:
$ ES_HOME/plugins/ik/config/IKAnalyzer.cfg.xml
配置档案IKAnalyzer.cfg.xml中的内容如下,预设如下:
IK Analyzer 扩充套件配置
该配置档案用于配置额外配置的扩充套件字典和扩充套件停止词字典,字典必须满足以下两个条件:
档案必须以UTF-8编码
每行一个词
配置档案中的ext_dict和ext_stopwords分别配置本地载入的扩充套件字典和扩充套件停止词字典,可以配置载入多个字典,他们以英文分号“;”做分隔符,不支援动态配置。remote_ext_dict和remote_ext_stopwords分别用于配置远端扩充套件词典和远端扩充套件停止词字典,可以用于动态载入字典,配置的地址为字典的URL地址,如“http://192.168.0.104/my.dic”,也可以以英文分号“;”做分隔符配置多个字典URL地址;为了让IK识别到字典有更新,需要在HTTP响应头Header中增加Last-Modified或ETag响应头,其中只要有一个响应头发生了变化,IK就会重新载入字典,这样就达到了通过远端档案对字典进行热更新的目的。
注:为了方便增加响应头,可以使用Nginx做为字典档案的HTTP服务器,Nginx会自动的为响应档案增加Last-Modified头。
如果没有配置扩充套件字典,IK预设不载入任何的扩充套件词,只加载以下的字典档案:
main.dic
preposition.dic
quantifier.dic
stopword.dic
suffix.dic
surname.dic
IK也自带了一些扩充套件词典:
extra_main.dic
extra_single_word_full.dic
extra_stopword.dic
extra_single_word.dic
extra_single_word_low_freq.dic
如果要想使用这些扩充套件词字典,只需要在配置档案IKAnalyzer.cfg.xml中配置好就行。
3、IK的使用
1)分词器的验证
验证一下IK是否安装成功,通过以下语句验证分词器ik_max_word。
请求:
GET /_analyze
{
"analyzer": "ik_max_word",
"text": ["中华人民共和国"]
}
响应:
{
"tokens" : [
{
"token" : "中华人民共和国",
"start_offset" : 0,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "中华人民",
"start_offset" : 0,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "中华",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 2
},
...省略更多的结果
]
}
通过以下语句验证分词器ik_smart。
请求:
GET /_analyze
{
"analyzer": "ik_smart",
"text": ["中华人民共和国"]
}
响应:
{
"tokens" : [
{
"token" : "中华人民共和国",
"start_offset" : 0,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 0
}
]
}
2)例项操作
以下是一个演示场景,先建立索引并指定mapping(如果不理解mapping,可以先理解为给数据库中表的字段定义型别,以后会详解),mapping中指定了用于测试的字段title的索引分析器为ik_max_word,希望其分析出的词项尽可能的多一些,以后被搜寻到的概率就会更多,而搜寻分析器指定的是ik_smark,希望搜寻出来的结果中要尽量的包含输入的内容,然后插入资料,再执行查询操作并比较查询结果。
建立索引
请求:
PUT /ik_index_sample
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
}
响应:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "ik_index_sample"
}
索引建立成功。
写入资料
通过批量操作语句写入以下测试资料。
请求:
POST /_bulk
{ "index" : { "_index" : "ik_index_sample", "_id" : "1" } }
{ "title" : "中华人民共和国(People\'s Republic of China),简称“中国”,成立于1949年10月1日,位于亚洲东部,太平洋西岸" }
{ "index" : { "_index" : "ik_index_sample", "_id" : "2" } }
{ "title" : "中国-网_中央人民-入口网站官网" }
{ "index" : { "_index" : "ik_index_sample", "_id" : "3" } }
{ "title" : "中国(世界四大文明古国之一)_百度百科" }
{ "index" : { "_index" : "ik_index_sample", "_id" : "4" } }
{ "title" : "“金蓝领”为“中国创造”添彩--社会--人民网" }
{ "index" : { "_index" : "ik_index_sample", "_id" : "5" } }
{ "title" : "在4月29日播出的《这就是中国》节目中,复旦大学中国研究院院长张维为教授就“西方中心论”进行了解构。" }
响应:
{
"took" : 76,
"errors" : false,
"items" : [
{
"index" : {
"_index" : "ik_index_sample",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1,
"status" : 201
}
},
...//省略掉多余的语句
]
}
响应提示资料插入成功。
搜寻
请求:
GET /ik_index_sample/_search
{
"query": {
"term": {
"title": {
"value": "中国"
}
}
}
}
响应:
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 5,
"relation" : "eq"
},
"max_score" : 0.11295266,
"hits" : [
{
"_index" : "ik_index_sample",
"_type" : "_doc",
"_id" : "4",
"_score" : 0.11295266,
"_source" : {
"title" : "“金蓝领”为“中国创造”添彩--社会--人民网"
}
},
...//省略其它4条资料
]
}
}
提示5条记录全部查询出来了,可以认为达到了我们的预期结果。