Elastcisearch中分词插件和同义词插件的安装及使用

Posted by Steven on 2018-11-22

这里只说明一下这次在使用 Elasticsearch 中用到的插件的安装与使用,本次只介绍IK分词、动态同义词插件的安装

一、准备工作

注意:插件的跟Elasticsearch的版本兼容很重要,一定要根据Elasticsearch的版本,选择合适版本的插件

二、IK分词器的安装与使用

安装

IK分词的安装简易采用这种方式安装,避免自己编译遇到各种问题,在节点的根目录下执行下面的命令:

1
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/downloa d/v6.3.1/elasticsearch-analysis-ik-6.3.1.zip

这样就可以直接安装好,不需要我们自己编译

使用

这里直接采用GitHub上提供的例子使用:(以下的语句直接复制到kibana的dev tools 上执行就可以了)

1、创建索引
1
curl -XPUT http://localhost:9200/index
2、创建mapping
1
2
3
4
5
6
7
8
9
curl -XPOST http://localhost:9200/index/fulltext/_mapping -H 'Content-Type:application/json' -d'
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word", "search_analyzer": "ik_max_word"
}
}
}'
3、添加一个数据(即文档)
1
2
3
4
5
6
7
8
curl -XPOST http://localhost:9200/index/fulltext/1 -H 'Content-Type:application/json' -d' {"content":"美国留给伊拉克的是个烂摊子吗"}
'
curl -XPOST http://localhost:9200/index/fulltext/2 -H 'Content-Type:application/json' -d' {"content":"公安部:各地校车将享最高路权"}
'
curl -XPOST http://localhost:9200/index/fulltext/3 -H 'Content-Type:application/json' -d' {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
'
curl -XPOST http://localhost:9200/index/fulltext/4 -H 'Content-Type:application/json' -d' {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
'
4、查询并高亮显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
curl -XPOST http://localhost:9200/index/fulltext/_search -H 'Content-Type:application/json' -d'
{
"query":{
"match":{
"content":"中国"
}
},
"highlight":{
"pre_tags":[
"<tag1>",
"<tag2>"
],
"post_tags":[
"</tag1>",
"</tag2>"
],
"fields":{
"content":{

}
}
}
}
'
5、不同的分词效果

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华 人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。

1
2
3
4
GET /_analyze?pretty=true
{
"analyzer": "standard",
"text": "hello word 中华人民共和国" }
1
2
3
4
GET /_analyze?pretty=true
{
"analyzer": "ik_smart",
"text": "hello word 中华人民共和国" }
1
2
3
4
GET /_analyze?pretty=true
{
"analyzer": "ik_max_word",
"text": "hello word 中华人民共和国" }

分别运行后查看结果

三、动态同义词插件的安装与使用

安装Dynamic Synonym for ElasticSearch

选择6.3.1:https://github.com/bells/elasticsearch-analysis-dynamic-synonym/archive/master.zip

解压该文件:(注意这里先不要将文件解压到Elasticsearch的plugins下面

1
unzip -o -d /usr/local/ master.zip

解压之后,进入解压文件夹,就会发现有几个文件,其中有个文件是pom.xml,这就是我们要编译的地方,直接在当前的文件夹下运行:

1
mvn package

之后就耐心的等着,估计要编译一会,编译过程如果有报错,根据报错信息予以解决 编译成功后,就会发现文件夹中多了几个文件,其中有个target文件夹

1
cd target/releases/

进到这个文件夹,就会发现有这样一个压缩包:elasticsearch-analysis-dynamic-synonym-{version}.zip

在elasticsearch节点的plugins文件夹下新建dynamic-synonym文件夹,然后将该文件解压到该文件夹下:

1
unzip -o -d /usr/local/elasticsearch/elasticsearch-6.3.1-node-1/plugins/dynamic-synonym/ elasticsear ch-analysis-dynamic-synonym-{version}.zip

解压完之后,去/plugins/dynamic-synonym/查看,发现dynamic-synonym这个文件夹下还包含一个文件夹,再下一级才是我们需要的,因此需要将该文件夹下的所有文件全部复 制到dynamic-synonym即可

重启elasticsearch服务

**注意:**上面说的插件,每个节点都是要安装的,安装的步骤是一样的

使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PUT /publishbuyersinfo
{
"settings": {
"analysis": {
"analyzer": {
"by_max_word": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": [
"remote_synonym"
]
}
},
"filter": {
"remote_synonym": {
"type": "dynamic_synonym",
"synonyms_path": "http://host:port/synonym.txt"
},
"local_synonym": {
"type": "dynamic_synonym",
"synonyms_path": "synonym.txt"
}
}
}
}
}

上面设置好之后,就可以配置分析器和过滤器了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PUT /publishbuyersinfo/_mapping/product
{
"properties": {
"sex": {
"type": "text",
"fielddata": true
},
"title": {
"type": "text",
"fielddata": true,
"analyzer": "by_max_word",
"search_analyzer": "by_max_word"
},
"sku": {
"type": "text",
"fielddata": true,
"analyzer": "by_max_word",
"search_analyzer": "by_max_word"
}
}
}

其中synonym.txt文件的规则要求:

a)、文件的格式非常重要

文件的格式必须是utf-8,有时候会同ftp下载下来直接用记事本打开,修改完之后直接上传就会有问题

b)、同义词配置的格式

格式1:

1
a,b => c

在分词的时候,a,b都会解析成为c,然后把c存入索引中

格式2:

1
a,b,c

在分词的时候,有a的地方,都会解析成a,b,c,把a,b,c存入索引中

相比之下格式1有个主词,比较省索引

这里有几个坑,有必要单独拎出来说一下:

  1. 配置的内容中,如果有大写,一律要写成小写,大写是没有作用的,当然,只是写成小写而已,用户 输入大写或者文档中有大写的,照样可以命中的;

  2. 远程词库

    http://host:port/synonym.txt

    在配置的时候一定要注意,初始化的时候,文件中一定要有内容,可以随便先写进去一组同义词,否则 在后面创建文档的时候就会报错:

    1
    fst must be non-nul

这块的文档太少了,查了很久才解决,初始化synonym.txt内容之后,记得先重启Elasticsearch服务,后面更新了这个文件之后就不需要再重启了,就会根据设置的频率自动同步生效

检验是否生效就很简单了,插入几条数据,搜索同义词,看看相关产品能否出来即可。

**附:**参考文档

https://blog.csdn.net/wwd0501/article/details/78259784

https://www.cnblogs.com/shaner/p/6428961.html

推荐文章