[es]elasticsearch章5 es的分词

szss szss     2023-03-10     780

关键词:

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

1.为什么明明有包含搜索关键词的文档,但结果里面就没有相关文档呢?

2.我存进去的文档到底被分成哪些词(term)了?

3.我自定义分词规则,但感觉好麻烦呢,无从下手

 

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 你可以快速验证自己要定制的分词器,当达到自己需求后,再将这一部分配置加入索引的配置。

至此,我们再看开篇的三个问题,相信你已经心里有答案了

es中中文分词器的使用

...一些es知识点。1.参考地址  github:https://github.com/medcl/elasticsearch-analysis-ik/   码云:https://gitee.com/sky_flying/elasticsearch-analysis-ik?_from=gitee_search 2.首先看自己的es版本   3.进入docker     4.在线安装  ... 查看详情

elasticsearch之中文分词器插件es-ik

 前提什么是倒排索引?Elasticsearch之分词器的作用Elasticsearch之分词器的工作流程Elasticsearch之停用词Elasticsearch之中文分词器Elasticsearch之几个重要的分词器       elasticsearch官方默认的分词插件  1、el... 查看详情

elkdocker6.elasticsearch集群启动多节点+解决es节点集群状态为yellow

...动的是单个的ES节点。 系列文章:【ELK】【docker】【elasticsearch】1.使用Docker和Elasticsearch+kibana5.6.9搭建全文本搜索引擎应用集群,安装ik分词器【ELK】【docker】【elasticsearch】2.使用elasticSearch+kibana+logstash+ik分词器+pinyin分词器+繁... 查看详情

分布式搜索引擎elasticsearch(代码片段)

目录1、ElasticSearch简介2、ELK简介 3、为什么要使用ES?4、ES能干什么?5、环境准备(软件安装)5.1安装ES—Windows5.2 ElasticSearch-Head插件安装5.3  ElasticSearch的可视化工具Kibana安装5.4 IK分词器插件5.5拼音分词器插件 ... 查看详情

精通系列es的基本操作,es安装,eshead+kibana(代码片段)

ElasticSearch8.x.x【一篇文章精通系列】【ES的基本操作,ES安装,EShead+Kibana】一、ElasticSearch的安装1、解压安装ES2、熟悉目录3、启动ES4、安装可视化界面(elasticsearchhead)5、了解ELK6、安装Kibana(1)下载解... 查看详情

精通系列es的基本操作,es安装,eshead+kibana(代码片段)

ElasticSearch8.x.x【一篇文章精通系列】【ES的基本操作,ES安装,EShead+Kibana】一、ElasticSearch的安装1、解压安装ES2、熟悉目录3、启动ES4、安装可视化界面(elasticsearchhead)5、了解ELK6、安装Kibana(1)下载解... 查看详情

elasticsearch中文分词器详解(代码片段)

1.es安装中文分词器官网:https://github.com/medcl/elasticsearch-analysis-ik1.1.安装中文分词器安装中文分词器的要求:​1.分词器的版本要与es的版本一直​2.所有es节点都需要安装中文分词器​3.安装完分词器需要重启1.在线安装[root@elastics... 查看详情

day112es中文分词介绍

一中文分词介绍elasticsearch提供了几个内置的分词器:standardanalyzer(标准分词器)、simpleanalyzer(简单分词器)、whitespaceanalyzer(空格分词器)、languageanalyzer(语言分词器)而如果我们不指定分词器类型的话,elasticsearch默认是使用标... 查看详情

es分词模块

Elasticsearch分片、路由、数据写入过程_星光之子0317的博客-CSDN博客Elasticsearch是怎么进行分词的?-运维派在搜索引擎这篇文章中写道,搜索引擎中有一个分词,切词的步骤,就是使用Analyzer来实现的。这篇文章将对A... 查看详情

elasticsearch笔记整理:javaapi使用与es中文分词

[TOC]pom.xml使用maven工程构建ESJavaAPI的测试项目,其用到的依赖如下:<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>2.3.0</version>& 查看详情

elasticsearch的keyword与text的区别

es2.*用户可忽略该文章。es2.*版本里面是没有这两个字段!!!当初接触es,最惊讶就是他的版本速度发布太快,这次主要讨论keyword与text的区别在es2.*版本里面是没有这两个字段,只有string字段。5.*之后,把string字段设置为了过... 查看详情

elasticsearch安装elasticsearch-analysis-ik中文分词器(代码片段)

1,讲分词器的文件夹放入es安装包的plugins,重新启动elasticsearch//查询es运行中的进程pidps-aux|grepelasticsearch//杀死进程kill-9pid//使用es账户启动nohup./elasticsearch&2,重启es,然后在新建index的type表结构时,需要指定将来可能要使用... 查看详情

elasticsearch安装elasticsearch-analysis-ik中文分词器(代码片段)

1,讲分词器的文件夹放入es安装包的plugins,重新启动elasticsearch//查询es运行中的进程pidps-aux|grepelasticsearch//杀死进程kill-9pid//使用es账户启动nohup./elasticsearch&2,重启es,然后在新建index的type表结构时,需要指定将来可能要使用... 查看详情

elasticsearch7.8.0版本进阶——ik中文分词器(代码片段)

...IK中文分词器下载地址下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.02.2、ES引入IK中文分词器将IK中文分词器安装包解压,然后把解压后的文件夹放入ES根目录下的plugins目录下,重启ES即可使用。注意&... 查看详情

es(六)elasticsearch搜索原理

参考技术A关于ES的搜索,小白暂且简单的归纳如下:  新增文档时涉及分词、构建索引    查询时涉及分词、查询索引、相关度评分那么接下来,小白就从分词、索引、相关度评分三个方面开始瞎掰了... &#... 查看详情

elasticsearch之中文分词器插件es-ik的热更新词库

  前提Elasticsearch之中文分词器插件es-ik的自定义词库      先声明,热更新词库,需要用到,web项目和Tomcat。不会的,请移步Eclipse下Maven新建项目、自动打依赖jar包(包含普通项目和Web项目)Tomcat*的安装... 查看详情

es实战系列-elasticsearch安装(代码片段)

文章目录Elasticsearch安装下载7.8.1版本集群部署安装报错创建用户ES安装集群安装管理注意事项es不能使用root用户运行错误:索引文件个数限制bind错误发送信息给master失败插件安装ES-HEADES-SQLcerebro安装kibana安装7.8.1安装中文分词... 查看详情

elasticsearch分词器,了解一下

...篇文章主要来介绍下什么是Analysis,什么是分词器,以及ElasticSearch自带的分词器是怎么工作的,最后会介绍下中文分词是怎么做的。首先来说下什么是Analysis:顾名思义,文本分析就是把全文本转换成一系列单词(term/token)的过... 查看详情