ES在插入文档的时候,对于 Text
类型的字段,会根据配置的分词器进行分词解析建立索引。
中文分词推荐使用 IK 分词器,使用方式是在网址下载对应版本的 Ik 分词器后,解压后,放入ES的 plugins 目录下
下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
目录结构如下所示
.
├── data
│ └── nodes
└── plugins
└── ik
解压并安装完成后,重启 ES即可。
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
,当然你可自己实现,这里给出一个范例:
其作用是将中文全部转换为拼音,详情可以参考如下文档
https://github.com/medcl/elasticsearch-analysis-pinyin