「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。
序
我又出现了,不过这次不是更新JVM系列,主要还是因为JVM这块比较费时。
鉴于MySQL和Redis都快被讲烂了,因此选择了ElasticSearch作为另外一个系列专栏。
这个专栏从创建开始,定位就只是满足大多数小伙伴的使用,可能不会讲的很深哈。
前言
众所周知,ElasticSearch具备非常优秀的检索文章的能力。主要得益于它本身的倒排索引结构,大大提升了检索的性能。(PS:这边默认大家知道哈,不知道的看官网:111)
有了倒排索引的原理,我们还需要知道它的用法。在倒排索引的内部组成有两部分重要组成,单词词典和倒排列表。
本篇的文章,就是带着大家了解,单词词典中的“单词”怎么来的!
Analysis是什么
首先解释一下,什么是 Analysis ? 可以把它理解为将文本转换成一系列单词(term/tokem)的过程(Analysis)。
在 ElasticSearch 中,Analysis这个过程的实现主要得益于Analyzer。Analyzer俗称分词器,基于多个可配置的部分,将文本按照某种形式转化成多个词。
Analyzer 分词器
首先,它的组成是什么?
- Character Filters :简单理解一下,就是针对原始文本处理,例如去除 Html,增删替换字符串,可以配置多个。
- Tokenizer:将原始文本按照规则分为单词。
- Token Filters:将切分后的单词进行加工,小写处理,删除停用词等等,可以配置多个。 整个流程类似于 MySQL整个架构中的:解析->查缓存->优化->存储引擎。 如果还是有点迷,我们举个栗子,看下图
针对 Mastering ElasticSearch & ElasticSearch in Action这句话,经过中间的分词器Analyzer,变成了 [Master、Action、ElasticSearch、ElasticSearch]四个词。
可能还是感知不强。我们实践一下(左边执行语句,右边结果)
- 第一步:
Character Filter,使用自带的Character Filter去除 Html
可以看到,我们通过自带的 html_strip 去除了 p 标签。
- 第二步,非常关键,将句子拆分成一个个词
通过指定切词器为 standard ,把原先的一句话分开了。尽管功能实现了,但还是有点瑕疵,类似于in 、the 这种高频出现但无意义的词还在,同理还有大小写这种。
- 第三步,去除时态、stopword 词、全小写
最终结果是这些对于查询基本无用的词被基本干掉了。
以上出现的部分都是ES自带组件,当然你也可以自定义修改它
结尾
ElasticSearch 的 Analyzer 是分为三部分的,其中我们的 char_filter 和 filter 是可以指定多个的(在指定的时候你发现它是个数组形式也可以猜出多个),并且也可以不指定。但是tokenizer 是必需要有的。
这里简单了解了一下基本的部分,那么如何自定义呢?如何指定我们自定义的分词器了,我们下一篇揭晓,博主努力更新中。这里推荐张超大大写的《ElasticSearch 源码解析与优化实战》。
下期预告:双亲委派模型的应用或者是自定义分词器,也可能是其他,哈哈。
扩展
内置的几个 Analyizer
下面的 ELasticSearch 自带的
| 名称 | 简介 |
|---|---|
| Standard Analyzer | 默认分词器,按词切分,小写处理,并支持删除停止词 |
| Simple Analyzer | 当遇到非字母的字符时切分。小写处理。 |
| Whitespace Analyzer | 每当遇到任何空白字符时切分词。没有小写处理。 |
| Stop Analyzer | simple 增强,支持删除停止词。 |
| Keyword Analyzer | 不切,原文直接输出 |
| Pattern Analyzer | 使用正则表达式将文本分割,默认非字符分割(\W+)。小写处理,删除停止字。 |
| Language Analyzers | 这里不是指一个叫做 Language 分词器,这里表示的 Elasticsearch提供了许多语言特定的分词器,比如 english 或 french。 |
| Fingerprint Analyzer | 这个比较特殊,官方是表示它可以生成用于重复检测的指纹,我还没碰到过 |
analyze api
这是一个特别好用的API,能便于我们查询切词器结果,快速排查解决问题。
比如如果某些词搜不到,就可以通过这个API快速定位是不是切词产生的问题。
-
指定分词器查看分词结果
GET _analyze { "analyzer": "standard", "text": "<p>Mastering ElasticSearch & ElasticSearch in Action</p>" } -
指定索引的字段查看该字段分词结果,可以用于得知咱们字段写入到单词词典中是那些词
POST news/_analyze { "field": "title", "text": ["他说的确实在理"] } -
自定义分词器进行测试,查看结果。
POST _analyze { "tokenizer": "keyword", "filter": ["lowercase"], "text": ["Mastering English"] }