ElasticSearch--分词器--使用/教程/实例
原文网址:ElasticSearch--分词器--使用/教程/实例_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍ES分词器的使用(知识+实例)。
Elasticsearch之所以全文搜索很快,是因为采用了倒排索引,倒排索引的核心是分词。分词:就是把内容拆分为很多个词语,ES是把text格式的字段按照分词器进行分词并保存为索引的。
本文版本
本文使用的ES版本为:7.15.0 (写本文时的最新稳定版)。
分词详解
Elasticsearch分析器有几个概念:Analysis、Analyzer、Character filters、Tokenizer、Token filter。
Analysis(分析器)功能是把文本切分成词项(词项是倒排索引中的基本单位)。分析器的功能主要是通过分词器(Analyzer)来实现的。
Analyzer由三部分组成:字符过滤器(Character filters)、分词器(Tokenizer)和词元过滤器(Token filter)。每一个Analyzer有且只能有一个tokenizer。
- Character filters:针对原始文本处理,例如去除html
- Tokenizer:按照规则将文本切分为单词
- Token Filter:将切分的单词进行加工,如单词小写、删除stopword、增加同义词等
执行流程如下:
内置分词器
简介
Elasticsearch已经提供了多种功能强大的内置分词器。
分词器 | 作用 |
---|---|
Standard |
ES默认分词器,把句子分成一个个的单词并转为小写,对于大多数欧洲语言(比如英语)进行分词非常合适。 |
Simple | 按照非字母字符切分,然后去除非字母字符并转为小写。 |
Stop | 与简单分词器类似,增加了停用词过滤功能,停用词包括the、a、is。最终按照非字母字符和停用词切分并转为小写。 |
Whitespace | 按照空格切分。 |
Language | 对特定语言进行切分。据说提供了30多种常见语言的分词器。 |
Pattern |
按正则表达式进行分词,支持停用词。默认是\W+,代表非字母。单词会转为小写。 |
Keyword | 不进行分词,作为一个整体输出。 |
本处的分词器指的是Analyzer,ES也内置了Tokenizer,但常用的是Analyzer这个概念,本处也贴出ES自带的Tokenizer,不是重点,可以跳过。
- Standard Tokenizer
标准分词器将文本划分为单词边界上的术语,这由Unicode文本分段算法定义。它删除大多数标点符号。这是大多数语言的最佳选择。 - Letter Tokenizer
字母分词器在遇到非字母字符时会将文本分为多个术语。 - Lowercase Tokenizer
小写分词器与字母分词器一样,在遇到非字母的字符时,会将文本分为多个词,但所有词都小写。 - Whitespace Tokenizer
每当遇到任何空白字符时,空格tokenizer都会将文本划分为多个term。 - UAX URL Email Tokenizer
uax_url_email tokenizer 类似于standard tokenizer,不同之处在于它将URL和电子邮件地址识别为单个token。 - Classic Tokenizer
经典的分词器是用于英语的基本语法的分词器。 - Thai Tokenizer
泰语分词器将泰语文本分成单词。 - N-Gram Tokenizer
这个tokenizer比较特殊,对于查询不使用空格或长单词的语言(例如德语)很有用。
他会首先按照一定的规则进行分词,然后对每个词输出一个n-gram,就是类似把单词做了一个滑窗处理一样。 - Edge N-Gram Tokenizer
作用类似n-gram,只是返回的分词结果是n-gram的一部分,他要求必须是从token的开头算起的n个char - Keyword Tokenizer
关键字分词器是一个“空”标记器,它接受给出的任何文本,并输出与输入完全相同的文本作为token。它可以与token filter (如lowercase)组合以对分析的术语进行归一化。 - Pattern Tokenizer
模式分词器使用正则表达式在与单词分隔符匹配时将文本拆分为多个token,或将匹配的文本捕获为token。 - Simple Pattern Tokenizer
simple_pattern 分词器使用正则表达式捕获匹配的文本作为term。它使用正则表达式功能的受限子集,并且通常比模式分词器更快。 - Char Group Tokenizer
char_group分词器可通过分割字符集进行配置,通常比运行正则表达式轻量。 - Simple Pattern Split Tokenizer
simple_pattern_split分词器使用与simple_pattern分词器相同的受限正则表达式子集,但是匹配的部分用来拆分输入,而不是将匹配部分作为结果返回。 - Path Tokenizer
路径分词器path_hierarchy分词器采用类似于文件系统路径的分层值,在路径分隔符上拆分,并为树中的每个组件产生一个term,例如/foo/bar/baz -> [/foo,/foo/bar,/foo/bar/baz]。
验证
可以使用ES的_analyze来查看如何分词的。
查看默认分词器的分词情况
POST _analyze
{"text": "我们是软件工程师"
}
结果(每个字都被拆开,且没有词语组合):
贴出全部结果
{"tokens": [{"token": "我","start_offset": 0,"end_offset": 1,"type": "<IDEOGRAPHIC>","position": 0}, {"token": "们","start_offset": 1,"end_offset": 2,"type": "<IDEOGRAPHIC>","position": 1}, {"token": "是","start_offset": 2,"end_offset": 3,"type": "<IDEOGRAPHIC>","position": 2}, {"token": "软","start_offset": 3,"end_offset": 4,"type": "<IDEOGRAPHIC>","position": 3}, {"token": "件","start_offset": 4,"end_offset": 5,"type": "<IDEOGRAPHIC>","position": 4}, {"token": "工","start_offset": 5,"end_offset": 6,"type": "<IDEOGRAPHIC>","position": 5}, {"token": "程","start_offset": 6,"end_offset": 7,"type": "<IDEOGRAPHIC>","position": 6}, {"token": "师","start_offset": 7,"end_offset": 8,"type": "<IDEOGRAPHIC>","position": 7}]
}
查看指定分词器的分词情况
本处以simple为例
POST _analyze
{"analyzer": "simple","text": "我们是软件工程师"
}
结果:(没有分)
中文分词器
简介
说明
从上边“内置分词器”的“实例”中可以看到,对汉字没有很好的分词。比如:软件、工程、工程师,这三个应该单独作为分词的。
考虑如下场景:我想搜索“软件”这两个字,但文档1里边有“微软的文件”这几个字,它也会被搜出,这是不合理的。
常用的中文分词器
- IK
- 支持自定义词库,支持热更新分词字典
- ICU Analyzer
- 提供了Unicode的支持,更好的支持亚洲语言
- THULAC
推荐使用IK分词器,这也是目前使用最多的分词器。本文使用IK分词器进行实例验证。
ik分词器介绍
GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.
ik分词器有两种Analyzer也有两种Tokenizer:
Analyzer: ik_smart , ik_max_word;Tokenizer: ik_smart , ik_max_word
安装ik分词器
1.下载
https://github.com/medcl/elasticsearch-analysis-ik
本处我在windows下验证,所以下载:elasticsearch-analysis-ik-7.15.0.zip
2.安装
在ES的安装目录的plugins目录下新建ik目录,将上边文件解压后放进去,结果:
实例
测试1:ik_smart
POST _analyze
{"analyzer": "ik_smart","text": "我们是软件工程师"
}
结果
测试2:ik_max_word
POST _analyze
{"analyzer": "ik_max_word","text": "我们是软件工程师"
}
结果
analyzer和search_analyzer
说明
分析器(analyzer)主要有两种情况会被使用:
- 插入文档时,将text类型的字段做分词然后插入倒排索引,。
- 在查询时,先对要查询的text类型的输入做分词,再去倒排索引搜索。
在索引(即插入文档)时,只会去看字段有没有定义analyzer,有定义的话就用定义的,没定义就用ES预设的。
在查询时,会先去看字段有没有定义search_analyzer,如果没有定义,就去看有没有analyzer,再没有定义,才会去使用ES预设的。
默认情况下,插入文档和查询使用的是同一种分析器,即字段映射中设置的analyzer,例如:
{"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_smart"}}}
}
我们也可以在插入文档和查询使用不同的分析器:(下边这种配置也是项目中常用的)
{"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_smart","search-analyzer": "ik_max_word"}}}
}
官网
search_analyzer | Elasticsearch Guide [7.15] | Elastic
其他网址
《从Lucene到Elasticsearch:全文检索实战》 => 4.3 中文分词器配置
elasticsearch安装和使用ik分词器_程序员欣宸的博客-CSDN博客_elasticsearch安装ik分词器
ElasticSearch中文分词,看这一篇就够了_静待花开-CSDN博客_elasticsearch 中文分词
4、ElasticSearch中的分词器_我就是我的博客-CSDN博客
解读Elasticsearch分析器中的重要术语-CSDN博客
02.analyzer-tokenizer_寒夜-CSDN博客
ElasticSearch--分词器--使用/教程/实例相关推荐
- elasticsearch分词器词库热更新三种方案
文章目录 一.本地文件读取方式 二.远程扩展热更新 IK 分词 三.重写ik源码连接mysql 一.本地文件读取方式 首先进入elasticsearch目录的plugins目录下,查看目录结构 2.进 ...
- 3. ElasticSearch分词器和聚合,数据的丰富和去重
ElasticSearch分词器和聚合,数据的丰富和去重 1. analyzer 1.1. 什么是analysis? 1.2. 如何定义一个定制的分析器 1.3. 中文分词器 2. Aggregati ...
- ElastIcSearch分词器
ElastIcSearch分词器 Analysis 和 Analyzer Analysis: 文本分析是把全文本转换一系列单词(term/token)的过程,也叫分词(Analyzer).Analys ...
- 2、Elasticsearch分词器简介与使用(一)
一.分词器的概念 1.Analysis Phase 在文档(Document)被添加到反向索引(inverted index)之前,Elasticsearch 对文档正文执行的过程称为分析阶段(Ana ...
- Solr使用IKAnalyzer中文分词器配置教程
Solr使用IKAnalyzer中文分词器配置教程 文件准备 开始配置 1.将分词器jar包放到自定义lib目录下 2.将IKAnalyzer.cfg.xml配置文件放到core的conf目录下 3. ...
- elasticsearch分词器Jcseg安装手册
Jcseg是什么? Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言 ...
- es过滤html标签,Elasticsearch 分词器
在全文搜索(Fulltext Search)中,词(Term)是一个搜索单元,表示文本中的一个词,标记(Token)表示在文本字段中出现的词,由词的文本.在原始文本中的开始和结束偏移量.以及数据类型等 ...
- Elasticsearch——分词器对String的作用
更多内容参考:Elasticsearch学习总结 关于String类型--分词与不分词 在Elasticsearch中String是最基本的数据类型,如果不是数字或者标准格式的日期等这种很明显的类型, ...
- 一、ElasticSearch分词器概念
java学习讨论群:725562382 1.Analysis 和 Analyzer Analysis: 文本分析是把全文本转换一系列单词(term/token)的过程,也叫分词.Analysis是通过 ...
最新文章
- 快速理解VirtualBox的四种网络连接方式
- .NET 基础 一步步 一幕幕 [注释、命名规则、访问修饰符、数据类型、常量、变量]...
- csv文件导入sqlite
- 【Python】随机划分数据集并生成VOC格式列表
- ubuntu 修改旋转屏幕显示方向 恢复正常模式
- 国内11所“袖珍”大学!最小的甚至只有一栋楼……
- div html 下边加横线_HTML的组成部分、DIV+CSS布局
- 必背42个单词_高中英语必背100个常考单词,考试必考
- Triumph X与K-Hyundai美术馆将于今年4月推出现代美术NFT
- ANT安装与测试和简明教程
- Intent中的Flag
- python网络编程相关
- 京东联盟新版API接口PHP版SDK的坑
- Markdown编辑器简单大概语法学习
- 目标跟踪质心跟踪算法
- python文本错别字检测
- 最齐全的黑防VIP教程,个人认为不错(123课)
- 应该用BPM管理业务规则吗?
- Java车牌号校验正则表达式
- js判断IE浏览器(包括IE11)
热门文章
- Deprecated Gradle features were used in this build, making it incompatible with Gradle
- 2020重庆市教育局网络安全攻防比赛——密码学
- Beagle填充之坑ERROR: REF field is not a sequence of A, C, T, G, or N characters at
- MongoDB账户管理
- 聚合签名、门限签名、Multisigs 和多签名
- Vue项目创建(2.x/3.x 自动/手动)及问题记录(路由注册不上)
- 快速计算十进制转二进制的方式
- 如何安装ATOM插件?
- 【金猿投融展】齐治科技——数据中心安全管理领军者
- 腾讯云开发环境部署系列教程一 【申请免费的腾讯云主机】