2019独角兽企业重金招聘Python工程师标准>>>

初次接触 Elasticsearch 的同学经常会遇到分词相关的难题,比如如下这些场景:

为什么明明有包含搜索关键词的文档,但结果里面就没有相关文档呢?我存进去的文档到底被分成哪些词(term)了?我自定义分词规则,但感觉好麻烦呢,无从下手

如果你遇到过类似的问题,希望本文可以解决你的疑惑。

1. 上手

让我们从一个实例出发,如下创建一个文档:

然后我们做一个查询,我们试图通过搜索 eat 这个关键词来搜索这个文档

ES的返回结果为0。这不太对啊,我们用最基本的字符串查找也应该能匹配到上面新建的文档才对啊!

各位不要急,我们先来看看什么是分词。

2. 分词

搜索引擎的核心是倒排索引(这里不展开讲),而倒排索引的基础就是分词。所谓分词可以简单理解为将一个完整的句子切割为一个个单词的过程。在 es 中单词对应英文为 term 。我们简单看个例子:

ES 的倒排索引即是根据分词后的单词创建,即我、爱、北京、天安门这4个单词。这也意味着你在搜索的时候也只能搜索这4个单词才能命中该文档。

实际上 ES 的分词不仅仅发生在文档创建的时候,也发生在搜索的时候,如下图所示:

读时分词发生在用户查询时,ES 会即时地对用户输入的关键词进行分词,分词结果只存在内存中,当查询结束时,分词结果也会随即消失。而写时分词发生在文档写入时,ES 会对文档进行分词后,将结果存入倒排索引,该部分最终会以文件的形式存储于磁盘上,不会因查询结束或者 ES 重启而丢失。

ES 中处理分词的部分被称作分词器,英文是Analyzer,它决定了分词的规则。ES 自带了很多默认的分词器,比如Standard、Keyword、Whitespace等等,默认是Standard。当我们在读时或者写时分词时可以指定要使用的分词器。

3. 写时分词结果

回到上手阶段,我们来看下写入的文档最终分词结果是什么。通过如下 api 可以查看:

其中test为索引名,_analyze为查看分词结果的endpoint,请求体中field为要查看的字段名,text为具体值。该 api 的作用就是请告诉我在 test 索引使用 msg 字段存储一段文本时,es 会如何分词。

返回结果如下:

返回结果中的每一个token即为分词后的每一个单词,我们可以看到这里是没有eat这个单词的,这也解释了在上手中我们搜索eat没有结果的情况。如果你去搜索eating,会有结果返回。

写时分词器需要在 mapping 中指定,而且一经指定就不能再修改,若要修改必须新建索引。如下所示我们新建一个名为ms_english的字段,指定其分词器为english:

4. 读时分词结果

由于读时分词器默认与写时分词器默认保持一致,拿 上手 中的例子,你搜索msg字段,那么读时分词器为Standard,搜索msg_english时分词器则为english。这种默认设定也是非常容易理解的,读写采用一致的分词器,才能尽最大可能保证分词的结果是可以匹配的。

然后 ES 允许读时分词器单独设置,如下所示:

如上analyzer字段即可以自定义读时分词器,一般来讲不需要特别指定读时分词器。

如果不单独设置分词器,那么读时分词器的验证方法与写时一致;如果是自定义分词器,那么可以使用如下的 api 来自行验证结果。

返回结果如下:

由上可知english分词器会将eating处理为eat,大家可以再测试下默认的standard分词器,它没有做任何处理。

5. 解释问题

现在我们再来看下 上手 中所遇问题的解决思路。

查看文档写时分词结果查看查询关键词的读时分词结果匹对两者是否有命中

我们简单分析如下:

由上图可以定位问题的原因了。

6. 解决需求

由于eating只是eat的一个变形,我们依然希望输入eat时可以匹配包含eating的文档,那么该如何解决呢?答案很简单,既然原因是在分词结果不匹配,那么我们就换一个分词器呗~ 我们可以先试下 ES 自带的english

分词器,如下:

执行上面的内容,我们会发现结果有内容了,原因也很简单,如下图所示:

由上图可见english分词器会将eating分词为eat,此时我们搜索eat或者eating肯定都可以匹配对应的文档了。至此,需求解决。

7. 深入分析

最后我们来看下为什么english分词器可以解决我们遇到的问题。一个分词器由三部分组成:char filter、tokenizer 和 token filter。各部分的作用我们这里就不展开了,我们来看下standard和english分词器的区别。

从上图可以看出,english分词器在 Token Filter 中和Standard不同,而发挥主要作用的就是stemmer,感兴趣的同学可以自行去看其它的作用。

8. 自定义分词

如果我们不使用english分词器,自定义一个分词器来实现上述需求也是完全可行的,这里不详细讲解了,只给大家讲一个快速验证自定义分词器效果的方法,如下:

通过上面的 api 你可以快速验证自己要定制的分词器,当达到自己需求后,再将这一部分配置加入索引的配置。

至此,我们再看开篇的三个问题,相信你已经心里有答案了,赶紧上手去自行测试下吧!

转载于:https://my.oschina.net/weiweiblog/blog/2993931

掌握 analyze API,一举搞定 Elasticsearch 分词难题相关推荐

  1. 如何使用实时计算 Flink 搞定实时数据处理难题?

    简介:如何使用实时计算 Flink 搞定实时数据处理难题?本文由阿里巴巴高级技术专家邓小勇老师分享,从实时计算的历史回顾着手,详细介绍了阿里云实时计算 Flink 的核心优势与应用场景,文章内容主要分 ...

  2. 华为云PB级数据库GaussDB(for Redis)揭秘第13期:如何搞定推荐系统存储难题

    摘要:GaussDB(for Redis)轻松搞定推荐系统核心存储,为企业级应用保驾护航. 本文分享自华为云社区<GaussDB(for Redis)揭秘第13期:如何搞定推荐系统存储难题?&g ...

  3. 36招搞定电脑一切难题

    1.解决插电即开机问题 现象:有些朋友有关机后断开电源板电源的习惯,可是却常常被一个问题困扰,就是电源板一通电,计算机就自动开机了,Power键形同虚设.解决:有些主板在BIOS设置的"Po ...

  4. 吐血推荐 36招搞定电脑一切难题

    1.解决插电即开机问题 现象:有些朋友有关机后断开电源板电源的习惯,可是却常常被一个问题困扰,就是电源 板一通电,计算机就自动开机了,Power键形同虚设.解决:有些主在BIOS设置的"Po ...

  5. 36招搞定电脑一切难题!!!

    1.解决插电即开机问题 现象:有些朋友有关机后断开电源板电源的习惯,可是却常常被一个问题困扰,就是电源板一通电,计算机就自动开机了,Power键形同虚设.解决:有些主板在BIOS设置的"Po ...

  6. 70个NumPy分级练习:用Python一举搞定机器学习矩阵运算

    翻译 | 人工智能头条 参与 | 王柯凝 责编 | suisui [AI科技大本营导读]Numpy是一个开源的Python科学计算库,专用于存储和处理大型矩阵,相比Python自身的嵌套列表结构要高效 ...

  7. 【舆情分析(1)】 舆情分析简介及百度AI开放接口搞定中文分词

    1. 舆情分析简介 1) 基本概念 舆情 -- 是"舆论情况"的简称,是指在一定的社会空间内,围绕中介性社会事件的发生.发展和变化,作为主体的民众对作为客体的社会管理者.企业.个人 ...

  8. 超全AI产品清单,分分钟搞定你的难题!

    作者:Liam Hänel 来源:大数据文摘 编译:赵逸云.蒋宝尚.钱天培 本文约6000字,建议阅读8分钟. 本文为大家盘点已实现产品化的商用AI,看看他们在业界都搞出些什么名堂. 人工智能席卷各行 ...

  9. 解密!谷歌这样搞定美军世纪难题,从眼科诊断到无人驾驶

    来源:智东西 导语:谷歌AI部门负责人Jeff Dean,在开发者大会中详细介绍了该公司如何利用AI技术解决科学问题. 5月14日消息,在加利福尼亚州山景城举行的谷歌年度I / O开发者大会上,谷歌研 ...

最新文章

  1. 2018-2019年新一代AI领域十大最具成长性技术展望
  2. SSH登录忽然变慢与DNS反向解析问题处理
  3. Android杂谈--layout的横竖屏处理
  4. FreeBSD没有安装Ports的解决办法
  5. anaconda+python3.6利用命令安装BeautifulSoup4-4.6.0
  6. 划重点!通俗解释协方差与相关系数
  7. android 内存分析 名词解释,Android内存分析和调优(下)
  8. 一个程序员的成长的六个阶段(转帖)
  9. 一加7 Pro高清渲染图曝光:A+屏幕 超棒手感
  10. 四种变量的区别(局部变量,全局变量,静态局部变量,静态全局变量)
  11. 大数据分析中常见的错误
  12. 做好数据分析的关键是打好组合拳
  13. oracle-Mount
  14. 数据分析----数据清洗和准备
  15. 【nginx】安装及防火墙配置
  16. NFT Insider #38:YGG旗下YGG SEA融资1500万美元,耐克收购虚拟时尚品牌RTFKT
  17. android热修复原理总结
  18. 利用“3 of 9 barcode”字体实现一维条形码(只支持英文等ASCII字符)
  19. Microsoft Web Farm Framework (WFF) 2.0 入门系列之一:WFF 介绍
  20. 电商策略2----超卖、少卖

热门文章

  1. AR独角兽的死亡教训:融资3亿美元后,成投资人提线木偶,营销大于产品技术...
  2. 意念控制成现实:不开口,不动手,“瘫着”就能打游戏
  3. 意念实时转语音!Facebook的非植入式脑机接口,解码准确率达到76%
  4. 卷积神经网络模型解读汇总——LeNet5,AlexNet、ZFNet、VGG16、GoogLeNet和ResNet
  5. 利用angular4和nodejs-express构建一个简单的网站(九)—用户登录
  6. Android PullToRefreshListView和ViewPager的结合使用
  7. Node.js链式回调
  8. Rhythmk 学习 Hibernate 02 - Hibernate 之 瞬时状态 离线状态 持久化状态 三状态
  9. 伪静态技术(SEO) 摘自:http://bbs.admin5.com/thread-8522290-1-1.html
  10. vsftp 550,227 报错解决