Elastic Search之分词

分词(Analysis):将文本切分为一系列单词的过程,比如 "美国留给伊拉克的是个烂摊子吗?"经过分词后的后果为:美国、伊拉克、烂摊子。

分词器(Analyzer):elasticsearch中执行的分词的主体,官方把分词器分成三个层次:

Character Filters:针对文档的原始文本进行处理,例如将印度语的阿拉伯数字"0 12345678 9"转换成拉丁语的阿拉伯数字"0123456789",或者去除HTML中的特殊标记符号,Character Filters可以有零或多个,安装顺序应用;

Tokenizer:核心,将文档的原始文本按照一定规则切分为单词,Tokenizer只能有一个;

Token Filter:对经过Tokenizer处理过后的单词进行二次加工,比如转换为小写,Token Filter也可以有多个,按顺序依次调用.

三者的调用顺序:Character Filters--->Tokenizer--->Token Filter


books Analyze API

es提供了endpoint为_analyze的语句来测试分词效果,你可以指定索引中的字段或者显式输入文本来测试分词效果


books 预定义的分词器

es自带的分词器如下,默认是standard,创建索引的mapping(类似于表结构)时候可指定

因为文档中的每个字段都会建立倒排索引,所以你也可以在创建索引的mapping时指定每个字段的分词器

下面简单的测试一下Standard、Simple、whitespace这三个分词器分词效果,其余的就不测试了。

其余的分词器留给大家自己去测试,分词器的选择还是很重要的,按照你想要的切分方式切分文本得到的分词效果,既可以节省空间,又可以较好的解决搜索问题。尤其是中文,如何切分是个难点,比如文本"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"如果经过默认的分词器standard analyzer切分的话,会得到"中、国、驻、洛、杉、矶、领、事、馆、遭、亚、裔、男、子、枪、击、嫌、犯、已、自、首",这显然不是我们想要的分词效果;再比如,"乒乓球拍卖完了",是切分为"乒乓球/拍卖/完了"还是切分为"乒乓球拍/卖完了"。这里分享一个常用的中文分词器:ik_smart,它能较好的切分中文及英文文本,支持自定义词库,开源分词器 ik 的github:https://github.com/medcl/elasticsearch-analysis-ik,安装iksmart分词器如下:

./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip

注意: 替换6.3.0为自己安装的elasticsearch版本,安装好后的ik插件在/elasticsearch/plugins/目录下,接着就可以直接指定分词器为ik_smart了,ik里面提供了ik_smart、ik_max_word,大家可以通过如下测试下两种分词器分词效果


books 分词使用时机

1.创建或更新文档时候,es会对相应的文档数据进行分词处理,比如你某个索引字段类型为text,那么插入一条文档时候就会对该字段进行分词处理,维护该字段文本内容的倒排索引,这种我们成为索引时分词;

2.查询时候,会对你的查询文本进行分词,比如你要查询"苹果手机",则会分词为"苹果、手机"两个单词;

我们可以在创建索引时候指定该字段的分词器:

创建索引mapping时候指定该字段的分词器

也可以在查询时指定分词器:

查询时指定分词器

实际使用时候我们需要明确文档中的某个字段是否要分词,如果没必要分词,请关闭,这能节省一定的空间及提高es的写入效率,同时实际生产中的具体的分词器选择要经过自己的实际测试。


books 上一篇: Elastic Search之倒排索引

books 下一篇: Elastic Search之自定义Mapping

books  参考:es官方文档https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

发布了202 篇原创文章 · 获赞 571 · 访问量 147万+

猜你喜欢

转载自blog.csdn.net/fanrenxiang/article/details/85275609