IK分词器插件
什么是IK分词器?
分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如 “我爱狂神” 会被分为"我","爱","狂","神",这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。
IK提供了两个分词算法:ik_smart 和 ik_max_word,其中 ik_smart 为最少切分,ik_max_word为最细粒度划分!一会我们测试!
安装步骤
- 1、下载ik分词器的包,Github地址:https://github.com/medcl/elasticsearch-analysis-ik/(版本要对 应)
- 2、下载后解压,并将目录拷贝到ElasticSearch根目录下的 plugins 目录中。
2022-08-15T07:00:17.png
- 3、重新启动 ElasticSearch服务,在启动过程中,你可以看到正在加载"analysis-ik"插件的提示信息,服务启动后,在命令行运行elasticsearch-plugin list 命令,确认 ik 插件安装成功。
2022-08-15T07:01:03.png
2022-08-15T07:01:14.png
- 4、在 kibana 中测试 ik 分词器,并就相关分词结果和 icu 分词器进行对比。
ik_max_word : 细粒度分词,会穷尽一个语句中所有分词可能,测试!
2022-08-15T07:01:49.png
ik_smart : 粗粒度分词,优先匹配最长词,只有1个词!
2022-08-15T07:02:15.png
- 5、我们输入超级喜欢狂神说!发现狂神说被切分了
2022-08-15T07:02:34.png
如果我们想让系统识别“狂神说”是一个词,需要编辑自定义词库。
步骤:
(1)进入elasticsearch/plugins/ik/config目录
(2)新建一个my.dic文件,编辑内容:
狂神说
(3)修改IKAnalyzer.cfg.xml(在ik/config目录下)
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!-- 用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">my.dic</entry>
<!-- 用户可以在这里配置自己的扩展停止词字典 -->
<entry key="ext_stopwords">
</entry>
</properties>
修改完配置重新启动elasticsearch,再次测试!
发现监视了我们自己写的规则文件:
2022-08-15T07:06:20.png
再次测试,发现狂神说变成了一个词:
2022-08-15T07:06:35.png
到了这里,我们就明白了分词器的基本规则和使用了!
Rest风格说明
一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
基本Rest命令说明:
2022-08-15T07:08:57.png
基础测试
- 1、首先我们浏览器 http://localhost:5601/ 进入 kibana里的Console
2、首先让我们在 Console 中输入 :
// 命令解释
// PUT 创建命令 test1 索引 type1 类型 1 id
PUT /test1/type1/1
{
"name":"狂神说", // 属性
"age":16 // 属性
}
返回结果 (是以REST ful 风格返回的 ):
// 警告信息:不支持在文档索引请求中指定类型
// 而是使用无类型的端点(/{index}/_doc/{id}, /{index}/_doc,或 /{index}/_create/{id})。
{ "_index" : "test1", // 索引
"_type" : "type1", // 类型
"_id" : "1", // id
"_version" : 1, // 版本
"result" : "created", // 操作类型
"_shards" : { // 分片信息
"total" : 2,
"successful" : 1,
"failed" : 0
},"_seq_no" : 0,
"_primary_term" : 1
}
- 3、那么 name 这个字段用不用指定类型呢。毕竟我们关系型数据库 是需要指定类型的啊 !
2022-08-15T07:14:27.png 4、指定字段类型
PUT /test2 {
"mappings": {
"properties": {
"name":{ "type": "text" },
"age":{ "type": "long" },
"birthday":{ "type": "date" }
}}} }
输出:
{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "test2" }
5、查看一下索引字段
{"test2":{
"aliases":{ }, "mappings":{ "properties":{ "age":{ "type":"long" }, "birthday":{ "type":"date" }, "name":{ "type":"text" } } }, "settings":{ "index":{ "creation_date":"1585384302712", "number_of_shards":"1", "number_of_replicas":"1", "uuid":"71TUZ84wRTW5P8lKeN4I4Q", "version":{ "created":"7060199" }, "provided_name":"test2" } }
}}
6、我们看上列中 字段类型是我自己定义的 那么 我们不定义类型 会是什么情况呢?
PUT /test3/_doc/1
{
"name":"狂神说",
"age":13,
"birth":"1997-01-05"
}
#输出
{"_index":"test3", "_type":"_doc", "_id":"1", "_version":1, "result":"created", "_shards":{ "total":2, "successful":1, "failed":0 }, "_seq_no":0, "_primary_term":1
}