ElasticSearch入门:ES分词器与自定义分词器
ES入门:ES分词器与自定义分词器
- 分词器的简单介绍
- 不同分词器的效果对比
- 自定义分词器的应用
分词器的简单介绍
分词器是es中的一个组件,通俗意义上理解,就是将一段文本按照一定的逻辑,分析成多个词语,同时对这些词语进行常规化的一种工具;ES会将text格式的字段按照分词器进行分词,并编排成倒排索引,正是因为如此,es的查询才如此之快;
es本身就内置有多种分词器,他们的特性与作用梳理如下:
分词器 | 作用 |
---|---|
Standard | ES默认分词器,按单词分类并进行小写处理 |
Simple | 按照非字母切分,然后去除非字母并进行小写处理 |
Stop | 按照停用词过滤并进行小写处理,停用词包括the、a、is |
Whitespace | 按照空格切分 |
Language | 据说提供了30多种常见语言的分词器 |
Patter | 按照正则表达式进行分词,默认是\W+ ,代表非字母 |
Keyword | 不进行分词,作为一个整体输出 |
这些分词器用于处理单词和字母,那功能基本已经覆盖,可以说是相当全面了!但对于中文而言,不同汉字组合成词语,往往多个字符组合在一起表达一种意思,显然,上述分词器无法满足需求;对应于中文,目前也有许多对应分词器,例如:IK,jieba,THULAC等,使用最多的即是IK分词器。
除了中文文字以外,我们也经常会使用拼音,例如各类输入法,百度的搜索框等都支持拼音的联想搜索,那么假如将数据存入到es中,如何通过拼音搜索我们想要的数据呢,这个时候对应的拼音分词器可以有效帮助到我们,它的开发者也正是ik分词器的创始人。
不同分词器的效果对比
各种分词器的功能介绍令人眼花缭乱,那么,在业务的应用与开发中,我们该如何选择合适的分词器来满足我们的业务需求呢?具体可以根据分词器的分词效果酌情选择;接下来就具体看看各个分词器的分词效果吧~
以 “text” : “白兔万岁A*” 为例:
- standard分词器 —— ES默认分词器,对于中文会按每个字分开处理,会忽略特殊字符
{"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},{"token": "a","start_offset": 4,"end_offset": 5,"type": "<ALPHANUM>","position": 4}]
}
- ik 分词器 —— 适用于根据词语查询整个内容信息,同样忽略其他特殊字符以及英文字符
{"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},{"token": "万","start_offset": 2,"end_offset": 3,"type": "TYPE_CNUM","position": 2},{"token": "岁","start_offset": 3,"end_offset": 4,"type": "COUNT","position": 3}]
}
- pinyin 分词器 —— 适用于通过拼音查询到对应字段信息,同时忽略特殊字符
{"tokens": [{"token": "bai","start_offset": 0,"end_offset": 0,"type": "word","position": 0},{"token": "btwsa","start_offset": 0,"end_offset": 0,"type": "word","position": 0},{"token": "tu","start_offset": 0,"end_offset": 0,"type": "word","position": 1},{"token": "wan","start_offset": 0,"end_offset": 0,"type": "word","position": 2},{"token": "sui","start_offset": 0,"end_offset": 0,"type": "word","position": 3},{"token": "a","start_offset": 0,"end_offset": 0,"type": "word","position": 4}]
}
自定义分词器的应用
不同分词器的分词效果各有不同,那么,假如我们需要完成一个模糊查询的搜索功能,以多种形式查询es中的同一个字段,例如类似于百度搜索框那样,既想通过简单词语或者单个字去搜索,又想根据拼音去搜索,很明显,单一种类的分词器是非常难以满足业务需求的;
此时,可以考虑构建索引字段中不同的field去适配多个分词器,例如:我们可以将字段设置多个分词器:
mapping:
{"properties":{"name":{"type":"text","analyzer":"ik_max_word"},"fields":{"PY":{"type":"text","analyzer":"pinyin"}}}
}
如果想要更加自由地使用es的分词功能,也许还能打开另一扇通往成功的大门 —— 自定义分词器,自定义分词器,顾名思义,就是通过不同分词器的组合以及相关属性设置,去创建符合自己心意的分词器,例如,如果我们既想通过词语联想一句话,又想享受拼音自动拼写转成词语的便捷,那么何不定义一个专属的分词器呢?例如:定义一个ik与拼音结合的分词器:
{"analysis":{"analyzer":{"my_max_analyzer":{"tokenizer":"ik_max_word","filter":"py"},"my_smart_analyzer":{"tokenizer":"","filter":"py"}},"filter":{"py":{"type":"pinyin","first_letter":"prefix","keep_separate_first_letter":true,"keep_full_pinyin":true,"keep_joined_full_pinyin":true,"keep_original":true,"limit_first_letter_length":16,"lowercase":true,"remove_duplicated_term":true}}}
}
此时,对应 “白兔万岁A*" 分词效果如下:
{"tokens": [{"token": "b","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "bai","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "白兔","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "baitu","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "bt","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "t","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 1},{"token": "tu","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 1},{"token": "w","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 2},{"token": "wan","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 2},{"token": "s","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 3},{"token": "sui","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 3},{"token": "万岁","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 3},{"token": "wansui","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 3},{"token": "ws","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 3},{"token": "w","start_offset": 2,"end_offset": 3,"type": "TYPE_CNUM","position": 4},{"token": "wan","start_offset": 2,"end_offset": 3,"type": "TYPE_CNUM","position": 4},{"token": "万","start_offset": 2,"end_offset": 3,"type": "TYPE_CNUM","position": 4},{"token": "s","start_offset": 3,"end_offset": 4,"type": "COUNT","position": 5},{"token": "sui","start_offset": 3,"end_offset": 4,"type": "COUNT","position": 5},{"token": "岁","start_offset": 3,"end_offset": 4,"type": "COUNT","position": 5}]
}
ElasticSearch入门:ES分词器与自定义分词器相关推荐
- ElasticSearch从入门到精通--第七话(自动补全、拼音分词器、自定义分词、数据同步方案)
ElasticSearch从入门到精通–第七话(自动补全.拼音分词器.自定义分词.数据同步方案) 使用拼音分词 可以引入elasticsearch的拼音分词插件,地址:https://github.c ...
- elasticsearch分词练习、自定义分词器练习
elasticsearch分词练习.自定义分词器练习 分词练习 自定义分词器 分词练习 准备数据 post metric_zabbix/log {"@message":" ...
- Elasticsearch 分布式搜索引擎 -- 自动补全(拼音分词器、自定义分词器、自动补全查询、实现搜索框自动补全)
文章目录 1. 自动补全 1.1 拼音分词器 1.2.1 自定义分词器 1.2.2 小结 1.2 自动补全 1.3 实现酒店搜索框自动补全 1.3.1 修改酒店映射结构 1.3.2 修改HotelDo ...
- 59、Docker ElasticSearch安装拼音分词器及自定义分词器
一.使用拼音分词器 1.拼音分词器 2.docker下安装拼音分词器插件 3.测试拼音分词器 # 测试拼音分词器 POST /_analyze { "text": [" ...
- ik分词器如何自定义分词
ik分词器如何自定义分词 声明 ik分词器如何自定义分词 自定义分词不生效问题 声明 本文涉及的es, elasticsearch-head, kibana, ik分词器的安装配置可以参考我的其它博客 ...
- Elasticsearch7 分词器(内置分词器和自定义分词器)
文章目录 Elasticsearch7 分词器(内置分词器和自定义分词器) analysis 概览 char_filter html_strip mapping pattern_replace fil ...
- WebServices中使用cxf开发日志拦截器以及自定义拦截器
首先下载一个cxf实例,里面包含cxf的jar包.我下的是apache-cxf-2.5.9 1.为什么要设置拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截 ...
- flume拦截器及自定义拦截器
拦截器做什么呢? 时间拦截器 以时间拦截器为例.会在Event的header中添加一个属性进去,属性的key叫做timestamp, value是当前的毫秒值. 问题是写到header然后呢?有啥用呢 ...
- 使用Docker快速安装部署ES和Kibana并配置IK中文分词器以及自定义分词拓展词库
使用Docker快速安装部署ES和Kibana的前提:首先需要确保已经安装了Docker环境 如果没有安装Docker的话,可以参考上一篇的内容:Linux上安装Docker 有了Docker环境后, ...
最新文章
- PHP获取毫秒时间戳,利用microtime()函数
- datetime 取分钟_datetime-Javascript,时间和日期:获取给定毫秒值的当前分钟,小时,天,周,月,年...
- 设计模式大集锦 程序员面试全攻略
- AttributeError: module 'tensorflow' has no attribute 'placeholder'等一系列tensorflow版本导致的问题
- Symbian中的新手问题整理(二)
- matlab自考本科真题,行政管理学自考专科试题及答案
- 终于有人讲明白了,原来这才是全球低时延一张网技术
- 微软AI实力秀:调侃Google吹牛;免费AI课程上线
- 关于各种服务器在境外的软件安装缓慢的问题解决方法
- [OpenBMC] 快速上手OpenBMC的Redfish
- kodi在电视上播放视频卡顿的解决办法
- MATLAB将MP4转为GIF
- matlab化工实例,运用MATLAB软件处理化工实验数据
- mysql使用union顺序混乱
- mocha java_Mocha
- 最全的正则表达式大全,手机号、邮箱等等
- Android开发范例实战宝典
- Java8新特性之Lambda,呦呦呦
- Android-手机杀毒
- 论文邮箱不是导师的_终极答案:你的论文为何在导师那里“石沉大海”?
热门文章
- 清华毕业生都去哪儿了
- 武大计算机保研北大,17名北大毕业生保研到武大?网友说亏大了,其实这些学生赚大了!...
- uniapp中的picker选择器
- mysql游戏名称_MySQL 游戏排行榜
- 老人理财经常被骗 80后如何帮父母理财
- 苹果用户如何1:10充值微信豆
- vue ref reactive
- 计算机什么专业可以自学考试,自学考试,计算机专业哪个专业好?
- php odbc连接池,修复︰ 使用连接池的 SQL Server ODBC 连接时设置的连接属性失败
- 手机可以模拟NFC卡片吗?项目中如何解决不能模拟NFC Tag UID的问题