elasticsearch IK分词器的安装、使用与扩展
ES 的默认分词器(standard)不支持中文分词,满足不了平时的需求,所以需要用能够支持中文分词的 IK 分词器。而且 IK 分词器也是支持英文分词的。
本文介绍下IK分词器的安装、基本使用方法;专有名词、同义词的使用;英文驼峰分词的实现。
下载与安装
中文IK分词器下载地址:Releases · medcl/elasticsearch-analysis-ik · GitHub
- 选择一个版本下载,然后解压。
- 在 elasticsearch 的 plugins 目录中新建文件夹 "ik"
- 将解压出来的所有东西都放到"ik"目录
- 修改 "plugin-descriptor.properties" 中的 "elasticsearch.version" 为你使用的 elasticsearch 版本(版本不一致的话启动会失败)
- 重启 elasticsearch
- 如果已经建了索引的话,索引也需要重建
重启后,IK分词器就生效了。
基本使用
IK分词器有两种分词模式:"ik_max_word" 和 "ik_smart"
- ik_max_word:会做最细粒度的拆分,把能拆分的词都拆出来
- ik_smart:会做最粗粒度的拆分,贪心算法,尽可能把词分得长
所以,建索引的时候建议用 ik_max_word,查询的时候用 ik_smart
"name":{
"type": "text",
"analyzer": "ik_max_word", "search_analyzer": "ik_smart"
},
通过 "_analyze" 查看分词结果:
专有名词
实际使用 IK 分词器时,有些专有名词也分不了,这时就需要自定义词典了。
比如宝可梦中有个叫"达克莱伊",这种专属词汇,IK分词器默认就分不了:
在 plugins/ik/config 目录中新增 "my.dic" 文件(名称自己定义),在 "my.dic" 中加入我们需要使用的专属词汇:
然后修改 "IKAnalyzer.cfg.xml" 文件,在 "ext_dict" 模块,增加 "my.dic"。
这里可以配置多个 dic 文件,多个之间用 ";" 分隔。
注意:集群中每个节点都要修改!
重启 es 后查看效果:分词器可以识别此专属词汇了
同义词
当我们在淘宝、京东上搜索"苹果"时,既能搜索出来iphone,又能搜出来真实吃的苹果。或者"西红柿"和"番茄",就是同一个东西。这种就要用到同义词了。
我想实现的效果:
- 不管输入【西红柿】还是【番茄】,都能同时搜出【西红柿 & 番茄】
- 在输入【苹果】时,能同时搜索出【苹果&iphone】,但是在输入【iphone】时,只能搜索出【iphone】
首先在 "plugins/ik/config" 目录下新建 "analysis" 目录,然后在 "analysis" 目录下新建文件 "synonym.txt"。之后在 "synonym.txt" 文件中添加同义词。
注意:是英文逗号!且集群中每个节点都要添加此配置!
这里使用了两种写法:
- 第一种是使用【逗号分隔】,平等看待所有的同义词
- 第二种是使用【类型扩展】,不平等地看待同义词
之后重启 es,然后创建索引时,对分词器进行扩展。同时,在需要的字段中设置使用扩展后的分词器:
"settings":{
"analysis": {
"analyzer": {
"synonym_smart": {
"type": "custom",
"tokenizer": "ik_smart",
"filter": ["synonym_filter"]
},
"synonym_max_word": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": ["synonym_filter"]
}
},
"filter": {
"synonym_filter": {
"type": "synonym",
"synonyms_path": "/usr/share/elasticsearch/plugins/ik/config/analysis/synonym.txt"
}
}
}
}"name":{
"type": "text",
"analyzer": "ik_max_word", "search_analyzer": "synonym_smart"
},
注意:这里虽然定义了 "synonym_max_word",但其实没有使用到它,建立索引时使用的分词器仍然是 "ik_max_word",而在搜索时使用了 "synonym_smart"。
因为如果在建立索引时使用了 "synonym_max_word",在输入 【iphone】时,也会搜索出来 【苹果】,而这不是我想要的效果。
具体可以参考官方文档关于【类型扩展】的说明:
扩展或收缩 | Elasticsearch: 权威指南 | Elastic
之后插入点数据,然后测试查询。
1)输入 "土豆" 或者 "马铃薯",都能同时搜到"土豆"与"马铃薯"
2)输入"苹果",能同时搜到"苹果"与"iphone"
3)输入"iphone",只能搜到"iphone"
英文驼峰形式分词
IK分词器默认也是不支持英文驼峰形式的分词的。比如 "PersonAndVehicleDetection" 这个字符串,使用 IK 分词器分析出来的结果,仍然是 "PersonAndVehicleDetection"
GET /book/_analyze
{
"field": "description",
"text": "PersonAndVehicleDetection"
}分析结果:
{
"tokens" : [
{
"token" : "personandvehicledetection",
"start_offset" : 0,
"end_offset" : 25,
"type" : "ENGLISH",
"position" : 0
}
]
}
此时,根据字符串 "person" 来查,是查不到的:
但是业务需要,在输入 person 或者 vehicle 时,也想要查询出此条数据时怎么办呢?那就需要对分词器做一些扩展,在创建索引时,在 settings 中的 analysis 里配置自己的分词器,然后在 mappings 中的字段中引用该分词器:
"settings":{
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "ik_max_word",
"char_filter": [
"camel_case_filter"
]
}
},
"char_filter": {
"camel_case_filter": {
"type": "pattern_replace",
"pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
"replacement": " "
}
}
}
}"description":{
"type": "text",
"analyzer": "my_analyzer", "search_analyzer": "ik_smart"
}
使用了新的 analyzer 之后再分析看结果:
然后再查询发现能查询到了:
elasticsearch IK分词器的安装、使用与扩展相关推荐
- ElasticSearch IK分词器安装
2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch 默认是带分词器了,对英文是按固定的英文的空格,或者"-"进行分词,但是对中文分 ...
- Elasticsearch(二) ik分词器的安装 以及 自定义分词
ik分词器作为elasticsearch的一个插件,则是安装在es插件中. ik分词器的安装 1,创建ik分词目录上传与es相同版本的ik分词器插件,不同版本可能es启动 报错 在elasticsea ...
- 04.ElasticSearch之IK分词器的安装与使用
ElasticSearch之IK分词器的安装与使用 前言 安装 离线安装 在线安装 ik分词器测试 扩展(停用)词(典) 测试数据 概念 配置词典 1.修改配置文件 2.新建词典 3.自定义内容 4. ...
- ElasticSearch IK 分词器快速上手
简介: ElasticSearch IK 分词器快速上手 一.安装 IK 分词器 1.分配伪终端 我的 ElasticSearch 是使用 Docker 安装的,所以先给容器分配一个伪终端.之后就可以 ...
- ElasticSearch——IK分词器的下载及使用
ElasticSearch--IK分词器的下载及使用 1.什么是IK分词器 ElasticSearch 几种常用分词器如下: 分词器 分词方式 StandardAnalyzer 单字分词 CJKAna ...
- 【Elasticsearch】es IK分词器的安装
1.概述 [Elasticsearch]es 7.8.0 唐诗三百首写入 Elasticsearch 会发生什么 之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字 ...
- ES入门学习:ElasticSearch、Kibana、ik分词器的安装、简单使用及SpringBoot集成
前言 es是采用Java语言开发,因此,想要安装运行es需要提前准备好jdk环境,关于linux配置jdk在前文linux配置jdk 本文主要介绍es的安装.kibana的安装和简单使用及ik分词器的 ...
- elastic ik分词搜索_php环境下使用elasticSearch+ik分词器进行全文搜索
php中文网最新课程 每日17点准时技术干货分享 首先需要说明的一点是,如果需要启用ik分词器,那么分词器的版本必须与es版本一致,即6.3.0的分词器需要同样6.3.0版本的es支持. 安装java ...
- ik分词器 mysql php_php环境下使用elasticSearch+ik分词器进行全文搜索
首先需要说明的一点是,如果需要启用ik分词器,那么分词器的版本必须与es版本一致,即6.3.0的分词器需要同样6.3.0版本的es支持. 安装java win-64bit的安装包需要去java英文官网 ...
最新文章
- 分享 10 道 Nodejs 进程相关面试题
- Play 2.0 用户指南 - 模版引擎 -- 针对Scala开发者
- 解决VSCode终端中禁止运行脚本问题的一种方式
- Docker学习——Dockerfile 指令详解(五)
- STL源码剖析 deque双端队列 概述
- tableview或scrollview Y轴发生变化解决方案
- MySQL初识-架构-安装-初始化-连接-管理工具-数据文件
- 开发过程中任何一个时刻,只关注解决当前面临的问题。
- SQL语句取得最大件数(MSSQL ORACLE Postgre,top rownum,limit)
- APP开发难吗?澳大利亚10岁儿童已开发5个手机App
- pvremore删除物理卷
- Java开发 明华usbkey_v3 明华二次开发包,usbkey 内有很多demo程序。 USB develop 238万源代码下载- www.pudn.com...
- C++通配符模糊匹配
- 来聊聊我的阿里云P7面试经历
- InnoDB中的页合并与分裂
- 胆囊炎以及胆结石的朋友注意了
- BZOJ3838 : [Pa2013]Raper
- 《数据结构与算法基础 严蔚敏版》第三章 堆栈与队列
- 如何解决微信端直接跳WAP端
- java 开发微型公众账号应用
热门文章
- GeForce 1080Ti显卡驱动+cuda8.0+cudnn6.0 外加TensorFlow-GPU
- springboot 自定义属性文件加载(ConfigDataLocationResolver)
- Sentinel key not found (H0007)
- Linux进程间通信详解(四) —— 共享内存及函数
- element ui el-input输入框type=number去掉上下箭头
- 从零开始读懂Web3:一起走进新一代互联网世界
- 入行软件测试3个月,每天平平无奇,感觉在浪费时间怎么办
- CorelDRAW2023新品发布会重磅来袭!CDR2023软件新功能抢先看!
- 2018下半年阿拉丁小程序白皮书发展8大预测 日活有望达到4亿
- 剖析抖音书单号的赚钱原理和运营技巧