文章目录

  • 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_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: $,√
      对于如下的mapping
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分词器相关推荐

  1. Elasticsearch中ngram和edgengram分词器

    1. Analysis 简介 理解elasticsearch的ngram首先需要了解elasticsearch中的analysis.在此我们快速回顾一下基本原理: 当一个文档被索引时,每个field都 ...

  2. 如何在Elasticsearch中安装中文分词器(IK+pinyin)

    如何在Elasticsearch中安装中文分词器(IK+pinyin) 如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当 ...

  3. Elasticsearch中安装IK分词器

    Elasticsearch中默认的分词器对中文的支持不好,会分隔成一个一个的汉字.而IK分词器对中文的支持比较好一些,主要有两种模式"ik_smart"和"ik_max_ ...

  4. ElasticSearch用法和IK分词器

    ElasticSearch用法和IK分词器 ElasticSearch 是什么? 为什么选择ES? ES提供的能力 ES常用使用场景 ES架构 ES 基本概念 ES 数据类型 ElasticSearc ...

  5. Elasticsearch:IK 中文分词器

    Elasticsearch 内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如: POST /_analyze {"text": "我爱北京天安门&quo ...

  6. 服务器安装配置elasticsearch,kibana,IK分词器和拼音分词器,集群搭建教程

    docker安装配置elasticsearch,kibana和IK分词器 elasticsearch文章系列 前置安装docker 创建docker网络 安装Elasticsearch 运行elast ...

  7. Elasticsearch Analyzer 内置分词器

    Elasticsearch Analyzer 内置分词器 篇主要介绍一下 Elasticsearch中 Analyzer 分词器的构成 和一些Es中内置的分词器 以及如何使用它们 前置知识 es 提供 ...

  8. Postman查看Elasticsearch自带的分词器效果

    Postman查看Elasticsearch自带的分词器效果 一.实验的前提是es服务器已经安装好并可以使用. 二.在postman上按照下图样式点击发送 查看结果 安装好ES之后,想看看ES自带的分 ...

  9. Elasticsearch 定义多个分词器模板

    Elasticsearch  定义多个分词器模板 版本:Elasticsearch  7.2.0 1.定义索引时,使用多个分词器 2.在模板中定义中使用多个分词器 3.ik+pinyin 对人工智能感 ...

最新文章

  1. WCF 改成 restful api
  2. 修改ie9默认的quirk模式
  3. 本机电脑与 Android 设备如何进行文件传输?
  4. php 日期转毫秒_【小技巧】 各种日期操作方法汇总
  5. ThinkPad R400 安装win2003网卡驱动
  6. android porting usb audio,android - 在android中启动时找不到audio-hal-2-0 - 堆栈内存溢出...
  7. 正则表达式验证IP和端口格式的正确性
  8. anaconda安装numpy_Python3.8如何安装Numpy
  9. 既然Java反射可以访问和修改私有成员变量,那封装成private还有什么意义
  10. 小程序毕设作品之微信小程序点餐系统毕业设计(5)任务书
  11. 游戏开发 | 基于 EasyX 库开发经典90坦克大战游戏
  12. 【计算机组成原理】CPU是什么
  13. 三个表内连接查询创建视图
  14. 华硕路由架设php,华硕 RT-AC68U 路由模式默认 VLAN
  15. 基于单片机自制MP3播放器,开源所有电路图,单片机程序
  16. 集成创新,拓展兼容--红旗Linux桌面版5.0隆重发布(转)
  17. python3环境配置教程_Python3 环境搭建
  18. 投影仪对眼睛好还是电视对眼睛好?解读给你看
  19. Anaconda点开 一直停留在 loading applications。。。
  20. 【Cheat Engine自带小游戏step1的通关思路】

热门文章

  1. 服务器和交换机如何连接以及配置
  2. 2007年的今天 第一代iPhone上市
  3. 深信服发布2019年三大业务品牌:智安全+云计算+新IT
  4. 2023MCMProblem A: Drought-Stricken Plant Communities问题A:受干旱破坏的植物群落思
  5. html切网页音乐会停,hexo NexT主题插入音乐
  6. 解决W11休眠一段时间后自动关机的问题
  7. html转化ipynb,jupyter .ipynb转.py的实现操作
  8. 阻止Popconfirm冒泡
  9. css实现加载中loading动画效果
  10. Java学习经验分享(2021秋招)