文章目录
- 1. 概述
- 2. 安装配置
- 3. 自定义拆分文本
- 4. 调用
- 4.1 拆分规则
- 4.2 Rest 调用
- 4.3 SpringBoot 调用
1. 概述
IK
分词器是ElasticSearch(es)
的一个最最最有名插件,能够把一段中文或者别的语句划分成一个个的关键字,进而在搜索的时候对数据库中或者索引库数据进一个匹配操作
举个小例子,可以将计算机科学与技术学院更细致的拆分为计算机、计算 、算机 、科学、与、技术、学院 、技术学院 … 等等
2. 安装配置
注意版本的对应,必须保证ik
分词器和es
是同一个版本
下载链接:ik分词器GitHub地址
在Elasticsearch7.6.2\plugins
目录下新建ik
目录,将压缩包解压
重启elasticsearch
和kibana
,可以看到ik
分词器已经被加载
3. 自定义拆分文本
有的时候,ik
分词器拆分出来的词语并不是我们想要的,或者说拆分出来的词语不够我使用,此时便可以自定义拆分文本
第一步,首先在Elasticsearch7.6.2\plugins\ik\config
目录下新建一个文本文件,命名为.dic
后缀的文件,例如我命名为myWord.dic
第二步,打开自定义的dic
文件,在其中编写你需要的词语(千万注意,这里要将文件的编码选择为UTF-8
,否则无法正确识别)
第三步,打开Elasticsearch7.6.2\plugins\ik\config
目录下的IKAnalyzer.cfg.xml
文件,将自定义的dic
文件写入
第四步,重启es
和kibana
,可以看到es
已经重新加载了我们自定义的dic
文件
4. 调用
4.1 拆分规则
ik
分词器拥有两种拆分规则,分别为ik_smart
和ik_max_word
ik_smart
:粗糙的拆分,列举常见的拆分
GET _analyze
{
"analyzer": "ik_smart",
"text": "计算机科学与技术学院"
}
ik_max_word
:最细致划分,列举所有的可能
GET _analyze
{
"analyzer": "ik_max_word",
"text": "计算机科学与技术学院"
}
4.2 Rest 调用
利用rest
风格,可以在创建索引时指定分词器
PUT /test2
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age":{
"type": "long"
},
"desc":{
"type": "text"
"analyzer":"ik_max_word",
}
}
}
}
4.3 SpringBoot 调用
也可以在SpringBoot
中指定分词器,前提是记得导入相关es
依赖
//创建使用ik分词器的索引
void createIndexWithIK() throws IOException {
//1、创建索引请求(这里千万要注意,创建的索引都要求小写)
CreateIndexRequest request = new CreateIndexRequest("test_index");
XContentBuilder mappingBuilder = XContentFactory.jsonBuilder();
mappingBuilder.startObject();
{
mappingBuilder.startObject("properties");
{
// 定义age属性
mappingBuilder.startObject("age");
{
mappingBuilder.field("type", "integer");
}
mappingBuilder.endObject();
// 定义name属性
mappingBuilder.startObject("name");
{
// 使用keyword类型,不进行分词
mappingBuilder.field("type", "keyword");
}
mappingBuilder.endObject();
// 定义desc属性
mappingBuilder.startObject("desc");
{
mappingBuilder.field("type", "text");
mappingBuilder.field("analyzer", "ik_max_word"); // 设置使用 IK 分词器
}
mappingBuilder.endObject();
}
mappingBuilder.endObject();
}
mappingBuilder.endObject();
// 2、将映射添加到索引请求中
request.mapping(mappingBuilder);
//3、客户端执行请求(使用默认的请求参数),获得请求后的响应
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(response.isAcknowledged());
}
查看索引是否创建成功