基于ElasticSearch|基于ElasticSearch Analyzer的使用规则详解
analyzer的使用规则
查询只能查找倒排索引表中真实存在的项, 所以保证文档在索引时与查询字符串在搜索时应用相同的分析过程非常重要,这样查询的项才能够匹配倒排索引中的项。
尽管是在说 文档 ,不过分析器可以由每个字段决定。 每个字段都可以有不同的分析器,既可以通过配置为字段指定分析器,也可以使用更高层的类型(type)、索引(index)或节点(node)的默认配置。在索引时,一个字段值是根据配置或默认分析器分析的。
例如为 my_index 新增一个字段:
PUT /my_index/_mapping/my_type{"my_type": {"properties": {"english_title": {"type":"string","analyzer": "english"}}}}
现在我们就可以通过使用 analyze API 来分析单词 Foxes ,进而比较 english_title 字段和 title 字段在索引时的分析结果:
GET /my_index/_analyze{"field": "my_type.title","text": "Foxes"} GET /my_index/_analyze{"field": "my_type.english_title","text": "Foxes"}
- 字段 title ,使用默认的 standard 标准分析器,返回词项 foxes 。
- 字段 english_title ,使用 english 英语分析器,返回词项 fox 。
如同 match 查询这样的高层查询知道字段映射的关系,能为每个被查询的字段应用正确的分析器。 可以使用 validate-query API 查看这个行为:
GET /my_index/my_type/_validate/query?explain{"query": {"bool": {"should": [{ "match": { "title":"Foxes"}},{ "match": { "english_title": "Foxes"}}]}}}
返回语句的 explanation 结果:
(title:foxes english_title:fox)match 查询为每个字段使用合适的分析器,以保证它在寻找每个项时都为该字段使用正确的格式。
默认分析器 虽然我们可以在字段层级指定分析器, 但是如果该层级没有指定任何的分析器,那么我们如何能确定这个字段使用的是哪个分析器呢?
分析器可以从三个层面进行定义:按字段(per-field)、按索引(per-index)或全局缺省(global default)。Elasticsearch 会按照以下顺序依次处理,直到它找到能够使用的分析器。索引时的顺序如下:
- 字段映射里定义的 analyzer ,否则
- 索引设置中名为 default 的分析器,默认为
- standard 标准分析器
- 查询自己定义的 analyzer ,否则
- 字段映射里定义的 analyzer ,否则
- 索引设置中名为 default 的分析器,默认为
- standard 标准分析器
为了区分,Elasticsearch 也支持一个可选的 search_analyzer 映射,它仅会应用于搜索时( analyzer 还用于索引时)。还有一个等价的 default_search 映射,用以指定索引层的默认配置。
如果考虑到这些额外参数,一个搜索时的 完整 顺序会是下面这样:
- 查询自己定义的 analyzer ,否则
- 字段映射里定义的 search_analyzer ,否则
- 字段映射里定义的 analyzer ,否则
- 索引设置中名为 default_search 的分析器,默认为
- 索引设置中名为 default 的分析器,默认为
- standard 标准分析器
Analysis 叫做分词,就是将文本转换为一系列单词(term/token)的过程。
Analysis 是通过Analyzer来实现的。
可使用Elasticserach内置的分析器或按需优化分需求或安装分析器插件 。
在数据写入的时候转换词条于Query语句查询的时候也需要用相同的分析器。
二、Analyzer的组成与工作机制
Character Filter 针对原始文本处理,例如去除html。
Tokenizer 按规则切分为单词。Tokenizer Filter将切分的单词进行加工,小写,删除stopwords,增加同义词。
文章图片
三、Elasticserach内置的一些分词器
1) _analyzer API 三种使用方法
文章图片
2) Standard Analyzer
原理
文章图片
示例
文章图片
3)Simple Analyzer
原理
文章图片
示例
文章图片
4)Whitespace Analyzer
原理
文章图片
【基于ElasticSearch|基于ElasticSearch Analyzer的使用规则详解】示例
文章图片
5)Stop Analyzer
原理
文章图片
示例
文章图片
6)Keyword Analyzer
原理
文章图片
示例
文章图片
7)Pattern Analyzer
原理
文章图片
示例
文章图片
8)Language Analyzer
支持按语言分词
文章图片
示例
文章图片
四、中文分词
中文分词的难点:
中文句子,切成一个一个词(不是一个一个字)。英文中,单词有自然的空格作为分隔。一句中文,在不同的上下文,有不同的理解。
1)ICU Analyzer
原理
文章图片
演示(需要提前安装 ICU Analyze 插件)
文章图片
2)IK
文章图片
3) THULAC
文章图片
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- 基于爱,才会有“愿望”当“要求”。2017.8.12
- javaweb|基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- 韵达基于云原生的业务中台建设 | 实战派
- EasyOA|EasyOA 基于SSM的实现 未完成总结与自我批判
- 基于stm32智能风扇|基于stm32智能风扇_一款基于STM32的智能灭火机器人设计
- stm32|基于STM32和freeRTOS智能门锁设计方案
- Python|Python 基于datetime库的日期时间数据处理