elasticsearch ngram和edgengram分词器
文章目录
- 1. Analysis 简介
- 2. index analyzer VS search analyzer
- 3. Analyze API
- 4. Ngram
- 5. Ngram Tokenizer
- 6. Ngram Token Filter
- 7. Edge Ngram
1. Analysis 简介
理解elasticsearch的ngram首先需要了解elasticsearch中的analysis。在此我们快速回顾一下基本原理:
当一个文档被索引时,每个field都可能会创建一个倒排索引(如果mapping的时候没有设置不索引该field)。倒排索引的过程就是将文档通过analyzer分成一个一个的term,每一个term都指向包含这个term的文档集合。当查询query时,elasticsearch会根据搜索类型决定是否对query进行analyze,然后和倒排索引中的term进行相关性查询,匹配相应的文档
analyzer = CharFilters(0个或多个) + Tokenizer(恰好一个) + TokenFilters(0个或多个)
2. index analyzer VS search analyzer
如果mapping
中只设置了一个analyzer,那么这个analyzer
会同时用于索引文档和搜索query
。当然索引文档和对query进行analysis
也可以使用不同的analyzer
一个特殊的情况是有的query是需要被analyzed,有的并不需要。例如match query
会先用search analyzer
进行分析,然后去相应field
的倒排索引进行匹配。而term query
并不会对query内容进行分析,而是直接和相应field的倒排索引去匹配
3. Analyze API
Analyze API是一个有效的方式查看分析后的结果:
POST _analyze
{"analyzer" : "standard","text" : "hello, world"
}
输出的结果如下所示,即[hello, world]
4. Ngram
在机器学习和数据挖掘领域,ngram通常指的是n个词的序列。不过在elasticsearch中,ngram代表的是n个字符的序列。可以把ngram理解成长度为n的滑动窗口,在文档中滑动产生的序列
5. Ngram Tokenizer
POST _analyze
{"tokenizer": "ngram","text": "Quick Fox"
}
ngram分词器默认会产生最小长度为1,最大长度为2的N-grams序列。上述查询语句的输出是
[ Q, Qu, u, ui, i, ic, c, ck, k, "k ", " “, " F”, F, Fo, o, ox, x ]
也可以自定义ngram tokenizer的一些配置:
min_gram: 指定产生的最小长度的字符序列,默认为1
max_gram: 指定产生的最大长度的字符序列,默认为2
token_chars: 指定生成的token应该包含哪些字符.对没有包含进的字符进行分割,默认为[],即保留所有字符
- letter - eg: a,b,字
- digit - eg: 3,7
- whitespace - eg: " ", “\n”
- punctuation - eg: !, "
- symbol - eg: $,√
定义min_gram
和max_gram
应该按照使用场景来定。使用ngram的一个常见场景就是自动补全。如果单个字符也进行自动补全,那么可能匹配的suggestion太多,导致没有太大意义。
另一个需要考虑的便是性能,产生大量的ngram占用空间更大,搜索时花费的事件也更多。
假如现在需要将ngrams生成的token都转换成小写形式,可以使用如下形式
PUT my_index
{"settings": {"analysis": {"tokenizer": {"ngram_tokenizer": {"type": "nGram","min_gram": 4,"max_gram": 4,"token_chars": [ "letter", "digit" ]}},"analyzer": {"ngram_tokenizer_analyzer": {"type": "custom","tokenizer": "ngram_tokenizer","filter": ["lowercase"]}}}}
}
POST my_index/_analyze
{"analyzer": "ngram_tokenizer_analyzer","text": "Hello, World!"
}
生成的结果序列是[ello, hell, orld, worl]
6. Ngram Token Filter
上述的例子也可以使用Ngram Token Filter
,配上standard的分词器和lower-case
的过滤器。
原文本被standard分词器以whitespace和punctuation分割成token,然后通过lowercase过滤器转换成小写形式,最后通过ngram filter生成长度为4的字符序列
PUT /my_index
{"settings": {"analysis": {"filter": {"ngram_filter": {"type": "nGram","min_gram": 4,"max_gram": 4}},"analyzer": {"ngram_filter_analyzer": {"type": "custom","tokenizer": "standard","filter": ["lowercase","ngram_filter"]}}}}
}POST my_index/_analyze
{"analyzer": "ngram_filter_analyzer","text": "Hello, World!"
}
上述mapping也会和ngram tokenizer产生同样的效果,具体实际应用如何选择应该视场景而定。假如想匹配的term中可以包含特殊字符,那么你应该使用ngram tokenizer。因为standard的tokenizer会过滤掉这些特殊字符。
7. Edge Ngram
Edge Ngram和ngram类似,只不过Edge Ngram产生的序列都是从代索引文档的开头延伸出去的。
POST _analyze
{"tokenizer": "edge_ngram","text": "Quick Fox"
}
会产生[ Q, Qu ]
Edge Ngram也有着和ngram相同的配置
min_gram: 指定产生的最小长度的字符序列,默认为1
max_gram: 指定产生的最大长度的字符序列,默认为2
token_chars: 指定生成的token应该包含哪些字符.对没有包含进的字符进行分割,默认为[],即保留所有字符
- letter - eg: a,b,字
- digit - eg: 3,7
- whitespace - eg: " ", “\n”
- punctuation - eg: !, "
- symbol - eg: $,√
对于如下的mapping
- symbol - eg: $,√
PUT my_index
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "my_tokenizer"}},"tokenizer": {"my_tokenizer": {"type": "edge_ngram","min_gram": 2,"max_gram": 10,"token_chars": ["letter","digit"]}}}}
}
POST my_index/_analyze
{"analyzer": "my_analyzer","text": "2 Quick Foxes."
}
产生的token序列为[ Qu, Qui, Quic, Quick, Fo, Fox, Foxe, Foxes ]
参考连接:
https://njucz.github.io/2017/12/20/elasticsearch%20ngram,edgengram%E7%AC%94%E8%AE%B0/
elasticsearch ngram和edgengram分词器相关推荐
- Elasticsearch中ngram和edgengram分词器
1. Analysis 简介 理解elasticsearch的ngram首先需要了解elasticsearch中的analysis.在此我们快速回顾一下基本原理: 当一个文档被索引时,每个field都 ...
- 如何在Elasticsearch中安装中文分词器(IK+pinyin)
如何在Elasticsearch中安装中文分词器(IK+pinyin) 如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当 ...
- Elasticsearch中安装IK分词器
Elasticsearch中默认的分词器对中文的支持不好,会分隔成一个一个的汉字.而IK分词器对中文的支持比较好一些,主要有两种模式"ik_smart"和"ik_max_ ...
- ElasticSearch用法和IK分词器
ElasticSearch用法和IK分词器 ElasticSearch 是什么? 为什么选择ES? ES提供的能力 ES常用使用场景 ES架构 ES 基本概念 ES 数据类型 ElasticSearc ...
- Elasticsearch:IK 中文分词器
Elasticsearch 内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如: POST /_analyze {"text": "我爱北京天安门&quo ...
- 服务器安装配置elasticsearch,kibana,IK分词器和拼音分词器,集群搭建教程
docker安装配置elasticsearch,kibana和IK分词器 elasticsearch文章系列 前置安装docker 创建docker网络 安装Elasticsearch 运行elast ...
- Elasticsearch Analyzer 内置分词器
Elasticsearch Analyzer 内置分词器 篇主要介绍一下 Elasticsearch中 Analyzer 分词器的构成 和一些Es中内置的分词器 以及如何使用它们 前置知识 es 提供 ...
- Postman查看Elasticsearch自带的分词器效果
Postman查看Elasticsearch自带的分词器效果 一.实验的前提是es服务器已经安装好并可以使用. 二.在postman上按照下图样式点击发送 查看结果 安装好ES之后,想看看ES自带的分 ...
- Elasticsearch 定义多个分词器模板
Elasticsearch 定义多个分词器模板 版本:Elasticsearch 7.2.0 1.定义索引时,使用多个分词器 2.在模板中定义中使用多个分词器 3.ik+pinyin 对人工智能感 ...
最新文章
- WCF 改成 restful api
- 修改ie9默认的quirk模式
- 本机电脑与 Android 设备如何进行文件传输?
- php 日期转毫秒_【小技巧】 各种日期操作方法汇总
- ThinkPad R400 安装win2003网卡驱动
- android porting usb audio,android - 在android中启动时找不到audio-hal-2-0 - 堆栈内存溢出...
- 正则表达式验证IP和端口格式的正确性
- anaconda安装numpy_Python3.8如何安装Numpy
- 既然Java反射可以访问和修改私有成员变量,那封装成private还有什么意义
- 小程序毕设作品之微信小程序点餐系统毕业设计(5)任务书
- 游戏开发 | 基于 EasyX 库开发经典90坦克大战游戏
- 【计算机组成原理】CPU是什么
- 三个表内连接查询创建视图
- 华硕路由架设php,华硕 RT-AC68U 路由模式默认 VLAN
- 基于单片机自制MP3播放器,开源所有电路图,单片机程序
- 集成创新,拓展兼容--红旗Linux桌面版5.0隆重发布(转)
- python3环境配置教程_Python3 环境搭建
- 投影仪对眼睛好还是电视对眼睛好?解读给你看
- Anaconda点开 一直停留在 loading applications。。。
- 【Cheat Engine自带小游戏step1的通关思路】
热门文章
- 服务器和交换机如何连接以及配置
- 2007年的今天 第一代iPhone上市
- 深信服发布2019年三大业务品牌:智安全+云计算+新IT
- 2023MCMProblem A: Drought-Stricken Plant Communities问题A:受干旱破坏的植物群落思
- html切网页音乐会停,hexo NexT主题插入音乐
- 解决W11休眠一段时间后自动关机的问题
- html转化ipynb,jupyter .ipynb转.py的实现操作
- 阻止Popconfirm冒泡
- css实现加载中loading动画效果
- Java学习经验分享(2021秋招)