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分词器与自定义分词器相关推荐

  1. ElasticSearch从入门到精通--第七话(自动补全、拼音分词器、自定义分词、数据同步方案)

    ElasticSearch从入门到精通–第七话(自动补全.拼音分词器.自定义分词.数据同步方案) 使用拼音分词 可以引入elasticsearch的拼音分词插件,地址:https://github.c ...

  2. elasticsearch分词练习、自定义分词器练习

    elasticsearch分词练习.自定义分词器练习 分词练习 自定义分词器 分词练习 准备数据 post metric_zabbix/log {"@message":" ...

  3. Elasticsearch 分布式搜索引擎 -- 自动补全(拼音分词器、自定义分词器、自动补全查询、实现搜索框自动补全)

    文章目录 1. 自动补全 1.1 拼音分词器 1.2.1 自定义分词器 1.2.2 小结 1.2 自动补全 1.3 实现酒店搜索框自动补全 1.3.1 修改酒店映射结构 1.3.2 修改HotelDo ...

  4. 59、Docker ElasticSearch安装拼音分词器及自定义分词器

    一.使用拼音分词器 1.拼音分词器 2.docker下安装拼音分词器插件 3.测试拼音分词器 # 测试拼音分词器 POST /_analyze {   "text": [" ...

  5. ik分词器如何自定义分词

    ik分词器如何自定义分词 声明 ik分词器如何自定义分词 自定义分词不生效问题 声明 本文涉及的es, elasticsearch-head, kibana, ik分词器的安装配置可以参考我的其它博客 ...

  6. Elasticsearch7 分词器(内置分词器和自定义分词器)

    文章目录 Elasticsearch7 分词器(内置分词器和自定义分词器) analysis 概览 char_filter html_strip mapping pattern_replace fil ...

  7. WebServices中使用cxf开发日志拦截器以及自定义拦截器

    首先下载一个cxf实例,里面包含cxf的jar包.我下的是apache-cxf-2.5.9 1.为什么要设置拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截 ...

  8. flume拦截器及自定义拦截器

    拦截器做什么呢? 时间拦截器 以时间拦截器为例.会在Event的header中添加一个属性进去,属性的key叫做timestamp, value是当前的毫秒值. 问题是写到header然后呢?有啥用呢 ...

  9. 使用Docker快速安装部署ES和Kibana并配置IK中文分词器以及自定义分词拓展词库

    使用Docker快速安装部署ES和Kibana的前提:首先需要确保已经安装了Docker环境 如果没有安装Docker的话,可以参考上一篇的内容:Linux上安装Docker 有了Docker环境后, ...

最新文章

  1. PHP获取毫秒时间戳,利用microtime()函数
  2. datetime 取分钟_datetime-Javascript,时间和日期:获取给定毫秒值的当前分钟,小时,天,周,月,年...
  3. 设计模式大集锦 程序员面试全攻略
  4. AttributeError: module 'tensorflow' has no attribute 'placeholder'等一系列tensorflow版本导致的问题
  5. Symbian中的新手问题整理(二)
  6. matlab自考本科真题,行政管理学自考专科试题及答案
  7. 终于有人讲明白了,原来这才是全球低时延一张网技术
  8. 微软AI实力秀:调侃Google吹牛;免费AI课程上线
  9. 关于各种服务器在境外的软件安装缓慢的问题解决方法
  10. [OpenBMC] 快速上手OpenBMC的Redfish
  11. kodi在电视上播放视频卡顿的解决办法
  12. MATLAB将MP4转为GIF
  13. matlab化工实例,运用MATLAB软件处理化工实验数据
  14. mysql使用union顺序混乱
  15. mocha java_Mocha
  16. 最全的正则表达式大全,手机号、邮箱等等
  17. Android开发范例实战宝典
  18. Java8新特性之Lambda,呦呦呦
  19. Android-手机杀毒
  20. 论文邮箱不是导师的_终极答案:你的论文为何在导师那里“石沉大海”?

热门文章

  1. 清华毕业生都去哪儿了
  2. 武大计算机保研北大,17名北大毕业生保研到武大?网友说亏大了,其实这些学生赚大了!...
  3. uniapp中的picker选择器
  4. mysql游戏名称_MySQL 游戏排行榜
  5. 老人理财经常被骗 80后如何帮父母理财
  6. 苹果用户如何1:10充值微信豆
  7. vue ref reactive
  8. 计算机什么专业可以自学考试,自学考试,计算机专业哪个专业好?
  9. php odbc连接池,修复︰ 使用连接池的 SQL Server ODBC 连接时设置的连接属性失败
  10. 手机可以模拟NFC卡片吗?项目中如何解决不能模拟NFC Tag UID的问题