- 作者: 博学谷狂野架构师
- GitHub:GitHub地址 (有我精心准备的130本电子书PDF)
只分享干货、不吹水,让我们一起加油!😄
概述
分词器的主要作用将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具
什么是分词器
顾名思义,文本分析就是把全文本转换成一系列单词(term/token)的过程,也叫分词。在 ES 中,Analysis 是通过分词器(Analyzer) 来实现的,可使用 ES 内置的分析器或者按需定制化分析器。
举一个分词简单的例子:比如你输入 ,会自动帮你分成两个单词,一个是 ,另一个是 ,可以看出单词也被转化成了小写的。
分词器的构成
分词器是专门处理分词的组件,分词器由以下三部分组成:
组成部分
character filter
接收原字符流,通过添加、删除或者替换操作改变原字符流
例如:去除文本中的html标签,或者将罗马数字转换成阿拉伯数字等。一个字符过滤器可以有
tokenizer
简单的说就是将一整段文本拆分成一个个的词。
例如拆分英文,通过空格能将句子拆分成一个个的词,但是对于中文来说,无法使用这种方式来实现。在一个分词器中,tokenizeer
token filters
将切分的单词添加、删除或者改变
例如将所有英文单词小写,或者将英文中的停词删除等,在中,不允许将的或者改变。同时,在一个分词器中,可以有零个或者多个.
分词顺序
同时 Analyzer 三个部分也是有顺序的,从图中可以看出,从上到下依次经过 , 以及 ,这个顺序比较好理解,一个文本进来肯定要先对文本数据进行处理,再去分词,最后对分词的结果进行过滤。
索引和搜索分词
文本分词会发生在两个地方:
- :当索引文档字符类型为时,在建立索引时将会对该字段进行分词。
- :当对一个类型的字段进行全文检索时,会对用户输入的文本进行分词。
配置分词器
默认ES使用,如果默认的分词器无法符合你的要求,可以自己配置
分词器测试
可以通过API来测试分词的效果。
指定分词器
使用地方
分词器的使用地方有两个:
- 创建索引时
- 进行搜索时
创建索引时指定分词器
如果设置手动设置了分词器,ES将按照下面顺序来确定使用哪个分词器:
- 先判断字段是否有设置分词器,如果有,则使用字段属性上的分词器设置
- 如果设置了,则使用该设置的分词器
- 如果上面两个都未设置,则使用默认的分词器
字段指定分词器
为title属性指定分词器
设置默认分词器
搜索时如何确定分词器
在搜索时,通过下面参数依次检查搜索时使用的分词器:
- 搜索时指定参数
- 创建mapping时指定字段的属性
- 创建索引时指定的
- 查看创建索引时字段指定的属性
- 如果上面几种都未设置,则使用默认的分词器。
指定analyzer
搜索时指定analyzer查询参数
指定字段analyzer
指定默认default_seach
内置分词器
es在索引文档时,会通过各种类型 对text类型字段做分析,
不同的 会有不同的分词结果,内置的分词器有以下几种,基本上内置的 包括 在内,对中文的分词都不够友好,中文分词需要安装其它
中文扩展分析器
中文分词器最简单的是ik分词器,还有jieba分词,哈工大分词器等
词语分词
标准分词器(Standard Tokenizer)
根据standardUnicode文本分段算法的定义,将文本划分为多个单词边界的上的术语
它是 ES 默认的分词器,它会对输入的文本按词的方式进行切分,切分好以后会进行转小写处理,默认的 stopwords 是关闭的。
使用案例
下面使用 Kibana 看一下它是怎么样进行工作的
原始内容
测试分词
在 Kibana 的开发工具(Dev Tools)中指定 Analyzer 为 ,并输入文本 ,然后我们运行一下:
可以看出是按照空格、非字母的方式对输入的文本进行了转换,比如对 做了转小写,对一些停用词也没有去掉,比如 ,其中 为分词结果; 为起始偏移; 为结束偏移; 为分词位置。
可配置项
简单分词器(Letter Tokenizer)
当simple分析器遇到非字母的字符时,它会将文本划分为多个术语,它小写所有术语,对于中文和亚洲很多国家的语言来说是无用的
它只包括了 的 ,它会按照非字母切分,非字母的会被去除,最后对切分好的做转小写处理,然后接着用刚才的输入文本,分词器换成 来进行分词,运行结果如下:
使用案例
原始内容
测试分词
空白分词器(Whitespace Tokenizer)
它非常简单,根据名称也可以看出是按照空格进行切分的
该whitespace分析仪将文本分为方面每当遇到任何空白字符,和上面的分词器不同,空白分词器默认并不会将内容转换为小写。
使用案例
原始内容
测试分词
电子邮件分词器(UAX URL Email Tokenizer)
此分词器主要是针对email和url地址进行关键内容的标记。
使用案例
原始内容
测试分词
可配置项
最大令牌长度。如果看到令牌超过此长度,则将其max_token_length间隔分割。默认为255
经典分词器(Classic Tokenizer)
可对首字母缩写词,公司名称,电子邮件地址和互联网主机名进行特殊处理,但是,这些规则并不总是有效,并且此关键词生成器不适用于英语以外的大多数其他语言
特点
- 它最多将标点符号拆分为单词,删除标点符号,但是,不带空格的点被认为是查询关键词的一部分
- 此分词器可以将邮件地址和URL地址识别为查询的term(词条)
使用案例
原始内容
测试分词
可配置项
最大令牌长度。如果看到令牌超过此长度,则将其max_token_length间隔分割。默认为255。
结构化文本分词
关键词分词器(Keyword Tokenizer)
它其实不做分词处理,只是将输入作为 Term 输出
关键词分词器其实是执行了一个空操作的分析,它将任何输入的文本作为一个单一的关键词输出。
使用案例
原始内容
测试分词
会发现前后内容根本没有发生改变,这也是这个分词器的作用,有些时候我们针对一个需要分词查询的字段进行查询的时候,可能并不希望查询条件被分词,这个时候就可以使用这个分词器,整个查询条件作为一个关键词使用
正则分词器(Pattern Tokenizer)
模式标记器使用 Java正则表达式。使用JAVA的正则表达式进行词语的拆分。
它可以通过正则表达式的方式进行分词,默认是用 进行分割的,也就是非字母的符合进行切分的。
使用案例
原始内容
测试分词
可配置项
正则分词器有以下的选项
路径分词器(Path Tokenizer)
可以对文件系统的路径样式的请求进行拆分,返回被拆分各个层级内容。
使用案例
原始内容
测试分词
可配置项
语言分词(Language Analyzer)
ES 为不同国家语言的输入提供了 分词器,在里面可以指定不同的语言
支持语种
支持如下语种:
使用案例
下面我们使用英语进行分析
原始内容
测试分词
自定义分词器
当内置的分词器无法满足需求时,可以创建类型的分词器。
配置参数
创建索引
上面的示例中定义了一个名为的分词器
该分词器的为,为,为,定义了两个分别为:和
使用案例
原始内容
测试分词
中文分词器
IKAnalyzer
IKAnalyzer是一个开源的,基于java的语言开发的轻量级的中文分词工具包
从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本,在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化
使用IK分词器
IK提供了两个分词算法:
- ik_smart:最少切分。
- ik_max_word:最细粒度划分。
ik_smart
使用案例
原始内容
测试分词
ik_max_word
使用案例
原始内容
测试分词
自定义词库
我们在使用IK分词器时会发现其实有时候分词的效果也并不是我们所期待的
问题描述
例如我们输入“传智教育的教学质量是杠杠的”,但是分词器会把“传智教育”进行拆开,分为了“传”,“智”,“教育”,但我们希望的是“传智教育”可以不被拆开。
解决方案
对于以上的问题,我们只需要将自己要保留的词,加到我们的分词器的字典中即可
编辑字典内容
进入elasticsearch目录中,创建我们自己的字典文件,并添加内容:
扩展字典
进入我们的elasticsearch目录 :,打开文件,进行如下配置:
再次测试
重启ElasticSearch,再次使用kibana测试
可以发现,现在我们的词汇”传智教育”就不会被拆开了,达到我们想要的效果了
本文由教研团队发布。
本文地址:http://dfvalve.xrbh.cn/quote/2946.html 迅博思语资讯 http://dfvalve.xrbh.cn/ , 查看更多