Elasticsearch之Analyzer分词器介绍

  • Analysis
    • Analyzer的组成
    • ES中内置的分词器
    • Analyzer的使用
    • 几种分词器介绍
    • Standard Analyzer
    • Simple Analyzer
      • Stop Analyzer
      • Whitespace Analyzer
      • Keyword Analyzer
      • Pattern Analyzer
      • Language Analyzer

Analysis

Analysis文本分析,也叫分词,是把全文本转换为一系列单词的过程。

Analyzer叫做分词器。Analysis是通过Analyzer来实现的,ES当中内置了很多分词器,同时我们也可以按需定制化分词器。

分词器的作用,除了在数据写入时对需要分词的字段进行词条切分转换,同时匹配Query语句的时候也需要使用相同的分词器对查询语句进行分析。

例如:
Elasticsearch is fun这个文本就会被分词器切分成,elasticsaerch、is、fun三个单词。

Analyzer的组成

通常Analyzer由三个部分组成。

  1. Character Filters:针对原始文本处理,例如去除html标签等。
  2. Tokenizer:按照一定的规则,对字符串进行切分单词。
  3. Token Filter:将切分的单词进行加工、大小写转换、删除stopwords、增加同义词等。

ES中内置的分词器

  • Standard Analyzer:默认分词器,按词切分,小写处理
  • Simple Analyzer:按照非字母切分(符号被过滤),小写处理
  • Stop Analyzer:小写处理,停用词过滤器(the、a、is等)
  • Whitespace Analyzer:按照空格切分,不转小写
  • Keyword Analyzer:不分词,直接将输入当作输出
  • Patter Analyzer:正则表达式,默认\W+(非字符分割)
  • Language:提供了30多种常见语言的分词器
  • Customer Analyzer:自定义分词器

Analyzer的使用

我们可以直接指定Analyzer进行分词测试。

举例:比如我们现在要查看一下ES是如何进行分词的。

GET /_analyze
{"analyzer": "standard","text":"Elasticsearch is fun"
}

返回如下,可以看到分词结果。token表示分词的单词,start_offset表示单词在文档中的开始位置,end_offset表示单词在文档中的结束位置,type表示单词的类型(文本/数字…),position表示单词在文档中的位置。

{"tokens" : [{"token" : "elasticsearch","start_offset" : 0,"end_offset" : 13,"type" : "<ALPHANUM>","position" : 0},{"token" : "is","start_offset" : 14,"end_offset" : 16,"type" : "<ALPHANUM>","position" : 1},{"token" : "fun","start_offset" : 17,"end_offset" : 20,"type" : "<ALPHANUM>","position" : 2}]
}

我们也可以指定索引的字段来进行分词测试,可以看到这个字段是如何对文本进行分词的。

比如我们要指定索引index中的字段comment字段来进行分词测试,发起请求如下:

post index/_analyze
{"field":"comment","text":"ES真好玩"
}

可以看到把我们输入的文本进行了分词处理。

{"tokens" : [{"token" : "es","start_offset" : 0,"end_offset" : 2,"type" : "<ALPHANUM>","position" : 0},{"token" : "真","start_offset" : 2,"end_offset" : 3,"type" : "<IDEOGRAPHIC>","position" : 1},{"token" : "好","start_offset" : 3,"end_offset" : 4,"type" : "<IDEOGRAPHIC>","position" : 2},{"token" : "玩","start_offset" : 4,"end_offset" : 5,"type" : "<IDEOGRAPHIC>","position" : 3}]
}

我们也可以自定义分词器进行测试

post /_analyze
{"tokenizer":"standard","filter":["lowercase"],"text":"Elasticsearch is FUN"
}
{"tokens" : [{"token" : "elasticsearch","start_offset" : 0,"end_offset" : 13,"type" : "<ALPHANUM>","position" : 0},{"token" : "is","start_offset" : 14,"end_offset" : 16,"type" : "<ALPHANUM>","position" : 1},{"token" : "fun","start_offset" : 17,"end_offset" : 20,"type" : "<ALPHANUM>","position" : 2}]
}

几种分词器介绍

Standard Analyzer

Standard Analyzer是ES中默认的分词器,它有几个规则:

  1. 按照单词进行切分
  2. 小写处理
  3. 它的Stop(词过滤器,is、the等)默认是关闭的。

GET /_analyze
{"analyzer": "standard","text":" 1 Elasticsearch is FUN5."
}{"tokens" : [{"token" : "1","start_offset" : 1,"end_offset" : 2,"type" : "<NUM>","position" : 0},{"token" : "elasticsearch","start_offset" : 3,"end_offset" : 16,"type" : "<ALPHANUM>","position" : 1},{"token" : "is","start_offset" : 17,"end_offset" : 19,"type" : "<ALPHANUM>","position" : 2},{"token" : "fun5","start_offset" : 20,"end_offset" : 24,"type" : "<ALPHANUM>","position" : 3}]
}

可以看到standard分词器,就是按照空格进行分词,没有过滤掉is这种关键字,并且没有过滤掉数字等。

Simple Analyzer

  1. 按照非字母切分,非字母的都会被去除
  2. 小写处理

GET /_analyze
{"analyzer": "simple","text":" 1 Elasticsearch is FUN511asd."
}{"tokens" : [{"token" : "elasticsearch","start_offset" : 3,"end_offset" : 16,"type" : "word","position" : 0},{"token" : "is","start_offset" : 17,"end_offset" : 19,"type" : "word","position" : 1},{"token" : "fun","start_offset" : 20,"end_offset" : 23,"type" : "word","position" : 2},{"token" : "asd","start_offset" : 26,"end_offset" : 29,"type" : "word","position" : 3}]
}

可以看到Simple分词器,把最后单词FUN511asd中的进行了切分,切分成fun和asd(这里不仅仅是数字,只要是非字母都会切分、符号等),并且全部转小写处理。

Stop Analyzer

  1. 按照非字母切分,非字母的都会被去除
  2. 小写处理
  3. 多了stop filter,会将is、a、the等关键词去除
GET /_analyze
{"analyzer": "stop","text":" 1 Elasticsearch is FUN511asd."
}{"tokens" : [{"token" : "elasticsearch","start_offset" : 3,"end_offset" : 16,"type" : "word","position" : 0},{"token" : "fun","start_offset" : 20,"end_offset" : 23,"type" : "word","position" : 2},{"token" : "asd","start_offset" : 26,"end_offset" : 29,"type" : "word","position" : 3}]
}

可以看到stop除了有simple的功能,还将一些关键词,比如is进行了去除

Whitespace Analyzer

  1. 按照空格进行切分

GET /_analyze
{"analyzer": "whitespace","text":" 1 Elasticsearch is FUN511asd."
}{"tokens" : [{"token" : "1","start_offset" : 1,"end_offset" : 2,"type" : "word","position" : 0},{"token" : "Elasticsearch","start_offset" : 3,"end_offset" : 16,"type" : "word","position" : 1},{"token" : "is","start_offset" : 17,"end_offset" : 19,"type" : "word","position" : 2},{"token" : "FUN511asd.","start_offset" : 20,"end_offset" : 30,"type" : "word","position" : 3}]
}

Keyword Analyzer

  1. 不进行分词,直接将输入当作一个term输出

GET /_analyze
{"analyzer": "keyword","text":" 1 Elasticsearch is FUN511asd."
}{"tokens" : [{"token" : " 1 Elasticsearch is FUN511asd.","start_offset" : 0,"end_offset" : 30,"type" : "word","position" : 0}]
}

Pattern Analyzer

  1. 通过正则表达式进行分词
  2. 默认是\W+,非字符的符号进行分割

GET /_analyze
{"analyzer": "pattern","text":" 1 Elasticsearch is FUN511asd-a."
}{"tokens" : [{"token" : "1","start_offset" : 1,"end_offset" : 2,"type" : "word","position" : 0},{"token" : "elasticsearch","start_offset" : 3,"end_offset" : 16,"type" : "word","position" : 1},{"token" : "is","start_offset" : 17,"end_offset" : 19,"type" : "word","position" : 2},{"token" : "fun511asd","start_offset" : 20,"end_offset" : 29,"type" : "word","position" : 3},{"token" : "a","start_offset" : 30,"end_offset" : 31,"type" : "word","position" : 4}]
}

可以看到FUN511asd-a被分成了fun511asd和a

Language Analyzer

可以指定不同的语言进行分词,比如English.

GET /_analyze
{"analyzer": "english","text":"ES真是太好玩了,Elasticsearch is FUN-fun"
}

但是对于中文来说,分词器就有了一些特定的难点:

  1. 一个句子,要被切分成一个个单词,而不是一个个的字。
  2. 在英文中,单词有空格进行分割,中文没有
  3. 一句中文,在不同的上下文语言环境中,有不同的意思
  4. 几句中文可能表达的是相同的意思,但是分词不同

我们可以安装不同的中文分词器
比如:
ICU Analyzer
IK-支持自定义词库,支持热更新分词字典
THULAC

Elasticsearch之Analyzer分词器介绍相关推荐

  1. “Elasticsearch + Kibana + ik分词器“介绍与使用

    Elasticsearch 介绍 Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例. 作为 Elastic Stack 的核心,它集中存 ...

  2. Elasticsearch:ICU 分词器介绍

    ICU Analysis 插件是一组将 Lucene ICU 模块集成到 Elasticsearch 中的库. 本质上,ICU 的目的是增加对 Unicode 和全球化的支持,以提供对亚洲语言更好的文 ...

  3. 【Elasticsearch】Elasticsearch analyzer 分词器

    文章目录 1.概述 1.1 什么是analysis? 2.发生时期 3.开箱即用analyzer 3.1 默认的分词器 3.Analyze API 4.分词器介绍 4.1.标准分词器 Standard ...

  4. ElasticSearch常用的分词器

    本文来说下有关ElasticSearch分词器的几个问题 文章目录 概述 什么是 Analysis 分词器的组成 Analyzer API ES分词器 Stamdard Analyzer Simple ...

  5. 04.ElasticSearch之IK分词器的安装与使用

    ElasticSearch之IK分词器的安装与使用 前言 安装 离线安装 在线安装 ik分词器测试 扩展(停用)词(典) 测试数据 概念 配置词典 1.修改配置文件 2.新建词典 3.自定义内容 4. ...

  6. Elasticsearch插件之分词器

    程序员小强总结的 ElasticSearch专题超全总结篇在这里:传送门 结合官网资料,做了更详细的实际使用总结. 从单机版安装到集群高可用生产环境搭建.基本概念(索引,分片,节点,倒排索引-).DS ...

  7. 【ES实战】ES分词器介绍

    文章目录 ES分词器介绍 什么是分词器 分词器的组成 Character filters Tokenizers Token filters 分词的过程 写入时分词 搜索时分词 测试分词效果 分词器的分 ...

  8. 2021年大数据ELK(八):Elasticsearch安装IK分词器插件

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 安装IK分词器 一.下载Elasticsearch IK分词器 ...

  9. Elasticsearch之中文分词器插件es-ik(博主推荐)

    前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasti ...

最新文章

  1. 宇宙的第一推动力,必然存在吗?
  2. JVM GC 日志详解
  3. 何为消息队列,为何使用消息队列,有什么消息队列插件
  4. 微信小程序 - 实现购物车结算
  5. JavaScript Tutorial
  6. 分布式理论(七): 一致性协议之 ZAB
  7. 讨厌麻烦的ora 01722无效数字
  8. 牛X网整理的JAVA面试题
  9. mysql分段统计ceil
  10. Vimium、CrxMouse配置信息
  11. 咋让计算机名字改为办公用计算机,让电脑变成历史:三星DeX将三星S8变成“办公电脑”...
  12. Windows字体美化指南
  13. matlab 判断鼠标按下_如何让MATLAB控制你的鼠标和键盘
  14. 学习Matlab的第一个程序——用二分法求根
  15. 第 342 场力扣周赛
  16. 书论55 郝经《移诸生论书法书》
  17. dotnet OpenXML 文本 Kerning 字间距的作用
  18. LVS+Keeplive 负载均衡
  19. 《瞳孔:一个开放源码平台,用于普遍的眼球追踪和基于移动凝视的交互》论文阅读
  20. MATLAB小提琴仿真(数学物理方程)大作业人工智能

热门文章

  1. 数据备份与重复数据删除
  2. pod指定路径下载第三方库
  3. 牛客网编程答题测试技巧
  4. Flink内存模型、网络缓冲器、内存调优、故障排除
  5. tankbot 机器人_每日一败:梦幻童年?这个TankBot机器人能搞定
  6. UE5/C++ 基于GAS的Combo连击 4.4 绑定鼠标按键事件
  7. 从零开始构建矽璓工业物联操作系统:使用risc-v架构的hifive1 emulator
  8. Linux常用命令 -- lsblk(简单易学)
  9. 基于Struts开发物流配送(快递)管理系统
  10. 【ns-3】添加nr(5G-LENA)模块