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_grammax_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: $,√
    对于如下的mappi
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 ]

Elasticsearch中ngram和edgengram分词器相关推荐

  1. elasticsearch ngram和edgengram分词器

    文章目录 1. Analysis 简介 2. index analyzer VS search analyzer 3. Analyze API 4. Ngram 5. Ngram Tokenizer ...

  2. elasticsearch倒排索引原理与中文分词器

    1. 索引的方式: 1.1 正向索引 正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档. 这种组织方法在建立索引的时候结构 ...

  3. 使用Docker 安装Elasticsearch、Elasticsearch-head、IK分词器 和使用

    使用Docker 安装Elasticsearch.Elasticsearch-head.IK分词器 和使用 原文:使用Docker 安装Elasticsearch.Elasticsearch-head ...

  4. elasticsearch安装和使用ik分词器

    在使用elasticsearch的时候,如果不额外安装分词器的话,在处理text字段时会使用elasticsearch自带的默认分词器,我们来一起看看默认分词器的效果: 环境信息 本次实战用到的ela ...

  5. ElasticSearch(六)【分词器】

    六.分词器 6.1 分词器介绍 Analysis 和 Analyzer Analysis:文本分析是把全文本转换一系列单词(term/token)的过程,也叫分词(Analyzer).Analysis ...

  6. Elasticsearch 入门 核心概念 数据结构 分词器 javaAPI

    ElasticSearch 1-今日内容 2-初识ElasticSearch 2.1-基于数据库查询的问题 2.2-倒排索引 2.2.1 评分TF/IDF/BM25计算 2.3-ES存储和查询的原理 ...

  7. r与python自然语言处理_Python自然语言处理实践: 在NLTK中使用斯坦福中文分词器 | 我爱自然语言处理...

    斯坦福大学自然语言处理组是世界知名的NLP研究小组,他们提供了一系列开源的Java文本分析工具,包括分词器(Word Segmenter),词性标注工具(Part-Of-Speech Tagger), ...

  8. Elasticsearch生产实战(ik分词器、拼音分词、自动补全、自动纠错)

    目录 一.IK分词器 1.IK分词器介绍 2.安装 3.使用 4.自定义词库 二.拼音分词器 1.拼音分词器介绍 2.安装 三.自动补全 1.效果演示 2.实战 四.自动纠错 1.场景描述 2.DSL ...

  9. ES入门学习:ElasticSearch、Kibana、ik分词器的安装、简单使用及SpringBoot集成

    前言 es是采用Java语言开发,因此,想要安装运行es需要提前准备好jdk环境,关于linux配置jdk在前文linux配置jdk 本文主要介绍es的安装.kibana的安装和简单使用及ik分词器的 ...

最新文章

  1. UI设计师面试如何操作才能获得高薪
  2. 比特币源码研读(4)数据结构-交易池TransactionPool
  3. python https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 解决方法
  4. 关于SAP的SD的定价公式的资料
  5. 台式电脑怎么改计算机名,台式电脑的设置在哪里
  6. 操作系统-信号量的使用
  7. Vue第二部分(3):路由 VueRouter
  8. ajax 限制显示条数,jquery通过ajax获取数据,控制显示的数据条数
  9. pyqt5快速开发与实战_用云开发快速制作客户业务需求收集小程序丨实战
  10. 怎么看登陆哪个用户名_面试教材看哪个版本?抽到的版本与备考的不一致怎么办?...
  11. 利用工作流给Windows SharePoint Service 3.0添加Skype通知功能
  12. jetson nano 自动调节风扇转速
  13. 安装win10系统以及升级win10 home至enterprise版本
  14. python爬虫实现hdu自动交题
  15. 青龙脚本--今日头条极速版
  16. matlab中国官网下载,首页 - MATLAB中文论坛
  17. 数据库--sql查询某一时间段数据
  18. CCS编写F28335定时器0测试程序报错unresolved symbols remain error解决方法
  19. CAD二次开发:用C#在AutoCAD中插入栅格图像
  20. Java实现第十届蓝桥杯最大降雨量

热门文章

  1. 单片机比赛准备01-蓝桥杯-CT107D硬件开发平台熟悉
  2. 高考选地理化学生物能考计算机专业吗,高考“3+3”中,选择了化学、生物、地理,那么将来能上什么专业?...
  3. 初窥Linux神秘面纱(叁):基本指令讲解(下)及疑难解惑(精)
  4. 经典算法07 快速排序
  5. 【Unity3D】键盘鼠标控制视角的移动
  6. pythonappium自动化框架_Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)...
  7. raw 格式镜像的 分区 、格式化和挂载操作
  8. php disconf,Disconf部署安装
  9. 2017java技术大会_欧洲EclipseCon 2017大会关键居然是这些!
  10. 基于SparkStreaming的实时数据清洗