说明
- ElasticSearch分词器
- 默认分词器(标准分词器)、ik分词器、ik分词器扩展字典自定义词语
- 关键词:keyword、text、ik_max_word、ik_smart、词条、词典、倒排表
- 官方文档:https://www.elastic.co/cn/
- ik分词器文档:https://github.com/medcl/elasticsearch-analysis-ik
核心概念
》数据类型说明
- keyword:关键词,不能被分词
- text:普通文本,可以被分词
》分词器概念
- 词条:索引中最小的存储和查询单元
- 词典:字典,词条的集合。B+,hashMap
- 倒排表:词条和文档ID的对照关系表
》默认分词器
- 默认分词器:standard(标准分词器)
- 默认分词器对中文不友好,默认所有中文都会被分为单个汉字
》ik分词器
- 处理中文分词非常友好,会将中文分为词组
- 提供了细粒度分词(ik_max_word)、粗粒度分词(ik_smart)两种选项
》ik分词器扩展字典
- 有时候一些专用自定义词语分词器是无法正确分词的,需要我们自定义扩展字典,ik分词器提供了该功能。
操作步骤
》使用默认分词器分词
-
使用默认分词器尝试分词一句中文
-
请求示例
-
请求方式:GET
-
发送请求:
curl -X GET http://192.168.3.201:9200/_analyze -H 'Content-Type:application/json' -d ' {"analyzer": "standard","text": "一句中文。" }'
- analyzer:分析器,不填默认就是standard(标准分析器)
-
响应结果:
{"tokens": [{"token": "一","start_offset": 0,"end_offset": 1,"type": "<IDEOGRAPHIC>","position": 0},{"token": "句","start_offset": 1,"end_offset": 2,"type": "<IDEOGRAPHIC>","position": 1},{"token": "中","start_offset": 2,"end_offset": 3,"type": "<IDEOGRAPHIC>","position": 2},{"token": "文","start_offset": 3,"end_offset": 4,"type": "<IDEOGRAPHIC>","position": 3}] }
-
》安装ik分词器
-
下载插件:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.9.3
[root@192 ES]# ll total 5124 -rw-r--r--. 1 501 games 4504423 Jan 23 15:40 elasticsearch-analysis-ik-7.9.3.zip
- 注意:下载的版本需要和你本地ES版本一致
-
解压缩到你的ES根目录下的plugins目录下,并更改所属用户和组为es
[root@192 plugins]# pwd /usr/local/es/7.9.3/plugins[root@192 plugins]# chown es:es elasticsearch-analysis-ik-7.9.3 -R[root@192 plugins]# ll total 0 drwx------. 3 es es 243 Jan 23 15:41 elasticsearch-analysis-ik-7.9.3
-
切换为es用户并重启ES服务(我之前已经停止,这里直接启动)
[es@192 7.9.3]$ pwd /usr/local/es/7.9.3[es@192 7.9.3]$ bin/elasticsearch ... [2099-01-23T15:46:02,970][INFO ][o.e.p.PluginsService ] [node-1] loaded plugin [analysis-ik] ...
- 通过启动日志可以看到已经成功加载了analysis-ik
》使用ik分词器分词
-
使用默认分词器尝试分词一句中文
-
请求示例
-
请求方式:GET
-
发送请求:
curl -X GET http://192.168.3.201:9200/_analyze -H 'Content-Type:application/json' -d ' {"analyzer": "ik_smart","text": "一句中文。" }'
-
响应结果:
{"tokens": [{"token": "一句","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "中文","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 1}] }
-
》ik分词器扩展字典实现自定义词语分词
-
自定义词语:
粉奶方配儿幼
-
切换到ik分词器配置文件夹
[es@192 config]$ pwd /usr/local/es/7.9.3/plugins/elasticsearch-analysis-ik-7.9.3/config
-
新建扩展字典文件,并加入自定义词语
[es@192 config]$ vi custom.dic 粉奶方配儿幼
-
关联扩展字典
-
打开配置文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict"></entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords"></entry><!--用户可以在这里配置远程扩展字典 --><!-- <entry key="remote_ext_dict">words_location</entry> --><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
-
修改后的内容:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict">custom.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords"></entry><!--用户可以在这里配置远程扩展字典 --><!-- <entry key="remote_ext_dict">words_location</entry> --><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
- 注意修改了这一行:
<entry key="ext_dict">custom.dic</entry>
- 注意修改了这一行:
-
-
切换为es用户并重启ES服务(我之前已经停止,这里直接启动)
[es@192 7.9.3]$ bin/elasticsearch
-
请求示例
-
Postman发送GET请求到如下URL:
http://192.168.3.201:9200/_analyze
-
请求方式:GET
-
发送请求:
curl -X GET http://192.168.3.201:9200/_analyze -H 'Content-Type:application/json' -d ' {"analyzer": "ik_smart","text": "粉奶方配儿幼。" }'
-
响应结果:
{"tokens": [{"token": "粉奶方配儿幼","start_offset": 0,"end_offset": 6,"type": "CN_WORD","position": 0}] }
-
》ik分词器在索引文档中使用
-
创建一个索引:
curl -X PUT http://192.168.3.201:9200/index001
-
给索引创建mapping:
curl -X POST http://192.168.3.201:9200/index001/_mapping -H 'Content-Type:application/json' -d' {"properties": {"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"}} }'
-
创建文档:
curl -X POST http://192.168.3.201:9200/index001/_create/1 -H 'Content-Type:application/json' -d' {"content": "中国人民万岁。" }'
-
高亮查询:
curl -X POST http://192.168.3.201:9200/index001/_search -H 'Content-Type:application/json' -d' {"query": {"match": {"content": "中国"}},"highlight": {"pre_tags": ["<tag1>","<tag2>"],"post_tags": ["</tag1>","</tag2>"],"fields": {"content": {}}} }'
-
响应结果:
{"took": 5,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 0.2876821,"hits": [{"_index": "index001","_type": "_doc","_id": "1","_score": 0.2876821,"_source": {"content": "中国人民万岁。"},"highlight": {"content": ["<tag1>中国</tag1>人民万岁。"]}}]} }