今天搞一搞ES的分词,经过这两天的了解,ES就是个无关系型数据库,对于接触过有关系型数据库的我来说,就先这么理解吧,没问题。
如果没有分词这个硬性需求的要求,无关系型数据库可选的很多,所以啦,用ES就是用他的分词功能。
版本ES 8.2
语言 python
Elasticsearch之所以全文搜索很快,是因为采用了倒排索引,倒排索引的核心是分词。分词:就是把内容拆分为很多个词语,ES是把text格式的字段按照分词器进行分词并保存为索引的。
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、增加同义词等
内置分词器的介绍
post _analyze (细颗粒度)
post _analyze
加上smart 结果没有分
默认的分词不包括中文,因此需要内置中文分词
常用的中文分词包括 IK , ICU Analyzer , THULAC,推荐使用IK 分词,这也是目前使用最多的中文分词。
IK 下载地址 https://github.com/medcl/elasticsearch-analysis-ik/releases
要保证IK版本和 ES 版本一致
1,在 elasticsearch 的 plugins 目录中新建文件夹 "ik"
2,将解压出来的所有东西都放到"ik"目录
3,修改 "plugin-descriptor.properties" 中的 "elasticsearch.version" 为你使用的 elasticsearch 版本(版本不一致的话启动会失败)
4,重启 elasticsearch
至此IK 安装完毕
IK分词器有两种分词模式:"ik_max_word" 和 "ik_smart"
- ik_max_word:会做最细粒度的拆分,把能拆分的词都拆出来
- ik_smart:会做最粗粒度的拆分,贪心算法,尽可能把词分得长
post _analyze
ik_max_word
自定义名词
实际使用 IK 分词器时,有些专有名词也分不了,这种就需要自己定义词典了。
在 plugins/ik/config 目录中新增 "my.dic" 文件(名称自己定义),在 "my.dic" 中加入我们需要使用的专属词汇即可
然后修改 "IKAnalyzer.cfg.xml" 文件,在 "ext_dict" 模块,增加 "my.dic"。
同义词
顾名思义,就是含义类似的词汇归为一类,这个也需要自定义配置
首先在 "plugins/ik/config" 目录下新建 "analysis" 目录,然后在 "analysis" 目录下新建文件 "synonym.txt"。之后在 "synonym.txt" 文件中添加同义词。
注意:是英文逗号!且集群中每个节点都要添加此配置!



