ES[7.6.x]学习笔记(六)分析器
在前面的章节中,我们给大家介绍了索引中的映射类型,也就是每一个字段都有一个类型,比如:long,text,date等。这和我们的数据库非常的相似,那么它的不同之处是什么呢?对了,就是全文索引,在ES当中,只有text类型的字段才会用的全文索引,那么这里就会引出ES中一个非常重要的概念,文本分析器(Text analysis)。
分析器使ES支持全文索引,搜索的结果是和你搜索的内容相关的,而不是你搜索内容的确切匹配。我们用ES官网中的例子给大家举例,假如你在搜索框中输入的内容是Quick fox jumps
,你想得到的结果是A quick brown fox jumps over the lazy dog
,或者结果中包含这样的词fast fox
或foxes leap
。
分析器之所以能够使搜索支持全文索引,都是因为有分词器(tokenization),它可以将一句话、一篇文章切分成不同的词语,每个词语都是独立的。假如你在ES索引中添加了一条记录the quick brown fox jumps
,而用户搜索时输入的内容是quick fox
,并没有完全匹配的内容,但是因为有了分词器,你索引的内容被切分成了不同的、独立的词,用户搜索的内容也会进行相应的切分,所以用户搜索的内容虽然没有完全匹配,但也能够搜索到想要的内容。
分析器除了要做分词,还要做归一化(Normalization)。分词器能够使搜索内容在每一个词上匹配,但这种匹配也只是在字面上进行的匹配。
- 比如你搜索
Quick
,但是不能匹配到quick
,它们的大小写不同。 - 比如你搜索
fox
,但是不能匹配到foxes
,它是复数形式。 - 比如你搜索
jumps
,不能匹配到leaps
,虽然它们是同义词。
为了解决这些问题,分析器要把这些分词归一化到标准的格式。这样我们在搜索的时候就不用严格的匹配了,相似的词语我们也能够检索出来,上面的3种情况,我们也能够搜索出相应的结果。
分析器的组成
分析器,无论是内置的,还是自定义的,都是由3部分组成:字符过滤器(character filters)、分词器(tokenizers)、分词过滤器(token filters)。
字符过滤器
字符过滤器接收最原始的文档,并且可以改变其内容,比如:可以把中文的一二三四五六七八九,变成阿拉伯数字123456789。它还可以过滤html标签,并对其进行转义。还可以通过正则表达式,把匹配到的内容转化成其他的内容。一个分析器可以有多个字符过滤器,也可以没有字符过滤器。
分词器
一个分析器只能有一个确定的分词器,它可以把一句话分成若干个词,比如:空格分词器。当你输入一句话Quick brown fox!
,它将被切分成[Quick, brown, fox!]
。
分词过滤器
分词过滤器接收分词并且可以改变分词,比如:小写分词过滤器,它将接收到的分词全部转换成小写。助词过滤器,它将删除掉一些公共的助词,比如英语里的 the
,is
,are
等,中文里的的
,得
等。同义词过滤器,它将在你的分词中,添加相应的同义词。一个分析器可以有多个分词过滤器,它们将按顺序执行。
我们在建立索引和搜索时,都会用的分析器。
配置文本分析器
前面我们讲了分析器的基本概念,也了解了全文搜索的基本步骤。下面我们看一下如何配置文本分析器,ES默认给我们配置的分析器是标准分析器。如果标准的分析器不适合你,你可以指定其他的分析器,或者自定义一个分析器。
ES有分析器的api,我们指定分析器和文本内容,就可以得到分词的结果。比如:
POST _analyze { "analyzer": "whitespace", "text": "The quick brown fox." }
返回的结果如下:
{ "tokens": [ { "token": "The", "start_offset": 0, "end_offset": 3, "type": "word", "position": 0 }, { "token": "quick", "start_offset": 4, "end_offset": 9, "type": "word", "position": 1 }, { "token": "brown", "start_offset": 10, "end_offset": 15, "type": "word", "position": 2 }, { "token": "fox.", "start_offset": 16, "end_offset": 20, "type": "word", "position": 3 } ] }
我们指定的分析器是空格分析器,输入的文本内容是The quick brown fox.
,返回结果是用空格切分的四个词。我们也可以测试分析器的组合,比如:
POST _analyze { "tokenizer": "standard", "filter": [ "lowercase", "asciifolding" ], "text": "Is this déja vu?" }
我们指定了标准的分词器,小写过滤器和asciifolding过滤器。输入的内容是Is this déja vu?
,我们执行一下,得到如下的结果:
{ "tokens": [ { "token": "is", "start_offset": 0, "end_offset": 2, "type": "<ALPHANUM>", "position": 0 }, { "token": "this", "start_offset": 3, "end_offset": 7, "type": "<ALPHANUM>", "position": 1 }, { "token": "deja", "start_offset": 8, "end_offset": 12, "type": "<ALPHANUM>", "position": 2 }, { "token": "vu", "start_offset": 13, "end_offset": 15, "type": "<ALPHANUM>", "position": 3 } ] }
我们可以看到结果中,is
变成了小写,déja
变成了deja
,最后的?
也过滤掉了。
为指定的字段配置分析器
我们在创建映射时,可以为每一个text
类型的字段指定分析器,例如:
PUT my_index { "mappings": { "properties": { "title": { "type": "text", "analyzer": "whitespace" } } } }
我们在my_index
索引中,创建了title
字段,它的类型是text
,它的分析器是whitespace
空格分析器。
为索引指定默认的分析器
如果我们觉得为每一个字段指定分析器过于麻烦,我们还可以为索引指定一个默认的分词器,如下:
PUT my_index { "settings": { "analysis": { "analyzer": { "default": { "type": "whitespace" } } } } }
我们为my_index
索引指定了默认的分析器whitespace
。这样我们在创建text
类型的字段时,就不用为其指定分析器了。
这一节给大家介绍了分析器,我们可以看到例子中都是使用的英文分析器,下一节我们一起看一下强大的中文分析器。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OSCHINA Chrome 浏览器插件 v1.8 发布
自 OSCHINA Chrome 浏览器插件在四月三十日发布了 v1.7 版本之后的几天时间里,热心网友们在 Gitee 上通过 issue 和 pull request的方式不断在交流,并终于在今天完成了几个重要的功能并发布。本次的更新内容,全部来自 Gitee 上开源爱好者无私奉献,在这里对 @陈李雨声 和 @衣沾不足惜 两位朋友表示感谢,并向他们表达崇高敬意。本次发布的新版本主要包括以下改动(对源码感兴趣的朋友请点击这里查看历史提交记录): 1. 新增功能:收藏文章功能 插件的首页列表中,提供了收藏功能(点击标题右侧的红心看看效果哦),可以将文章收入 Chrome 浏览器的收藏夹中。(PS:第一次收藏文章时,会在 Chrome 收藏夹中新增「开源中国」文件夹)再次点击已经收藏的文章,可将该文章从收藏夹中移除。 2. 新增功能:记忆下拉列表分类 每次打开插件时,都需要手动选择下拉列表中自己感兴趣的内容,是不是很烦躁?莫慌,本次更新新增了记忆功能:插件会自动记录最后一次选择的分类并将其记录在案,再次打开插件时就不需要再手动选择了。 3. 修复:文章简介中特殊字符转义导致的样式错乱问题...
- 下一篇
如何轻松学习 Kubernetes?
作者 | 声东 阿里巴巴技术专家 <关注阿里巴巴云原生公众号,回复排查即可下载电子书> 导读:《深入浅出 Kubernetes》一书共汇集 12 篇技术文章,帮助你一次搞懂 6 个核心原理,吃透基础理论,一次学会 6 个典型问题的华丽操作! 什么是 Kubernetes? 我们来看一下什么是 Kubernetes。这部分内容我会从四个角度来跟大家分享一下我的看法。 1. 未来什么样 这是一张未来大部分公司后端 IT 基础设施的架构图。简单来说,以后所有公司的 IT 基础设施都会部署在云上。用户会基于 Kubernetes 把底层云资源分割成具体的集群单元,给不同的业务使用。而随着业务微服务化的深入,服务网格这样的服务治理逻辑会变得跟下边两层一样,成为基础设施的范畴。 目前,阿里基本上所有的业务都跑在云上。而其中大约有一半的业务
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装