ES在插入文档的时候,对于 Text 类型的字段,会根据配置的分词器进行分词解析建立索引。
IK 分词器
中文分词推荐使用 IK 分词器,使用方式是在网址下载对应版本的 Ik 分词器后,解压后,放入ES的 plugins 目录下
下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
目录结构如下所示
.├── data│ └── nodes└── plugins└── ik
简答使用
IK 分词器有 2 种模式:ik_max_word 和 ik_smart
ik_max_word会尽可能的去分词,建议在建立索引的时候使用。ik_smart会智能分词,分出来的词组通常回避max少,建议搜索的时候使用
例如:
GET /_analyze{"text": "ES默认的分词器是standard,对英文比较友好","analyzer": "ik_max_word"}GET /_analyze{"text": "ES默认的分词器是standard,对英文比较友好","analyzer": "ik_smart"}
自定义词库
IK 支持自定义本地词库和远程词库。建立灵活性,建议常用的词库放本地,动态的词库放远程,并且为了减轻网络流量,建议隔三差五的将动态词库的内容同步到本地词库。
自定义 词库的配置文件在:{conf}/analysis-ik/config/IKAnalyzer.cfg.xml 中。
本地词库
当Ik分词器解析出来的效果不是你想要的时候,比如一个名字:王阿曼,你可以修改配置文件
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords"></entry><!--用户可以在这里配置远程扩展字典 --><entry key="remote_ext_dict">http://127.0.0.1:8888/es/remote</entry><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> --></properties>
上述配置定义了custom/mydict.dic 作为本地词库。
所以需要在对应的 xml 目录新建文件夹custom,然后建立对应的文件。
文本编码,一定要是 UTF-8,Windows 下的用户特别注意了。
我在 mydict.dic 下配置了一个字段叫做王阿曼,那么再调用分词器解析后的效果可以看出,这个单词并没有拆分。
远程词库
ES 的远程词库需要在配置文件中配置文件,然后插件会根据地址,每隔一定时间作如下事情:
- 发送
Head请求,尝试获取ETag`和Last-modify`并跟上次请求的进行对比,只要有任何一个不一致,进行下一步 - 发送
Get请求获取新的词库。
综上,ES远程词库的 Server端要支持 Head 和 Get。
官方建议是利用Nginx作为 Server,当然你可自己实现,这里给出一个范例:
范例 1
拼音
其作用是将中文全部转换为拼音,详情可以参考如下文档
https://github.com/medcl/elasticsearch-analysis-pinyin
