驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
【ELK】中文分词器相关
/  

【ELK】中文分词器相关

ES在插入文档的时候,对于 Text 类型的字段,会根据配置的分词器进行分词解析建立索引。

IK 分词器

中文分词推荐使用 IK 分词器,使用方式是在网址下载对应版本的 Ik 分词器后,解压后,放入ES的 plugins 目录下

下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

目录结构如下所示

.
├── data
│   └── nodes
└── plugins
    └── ik

解压并安装完成后,重启 ES即可。

简答使用

IK 分词器有 2 种模式:ik_max_wordik_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 的远程词库需要在配置文件中配置文件,然后插件会根据地址,每隔一定时间作如下事情:

  1. 发送Head请求,尝试获取ETag`和Last-modify`并跟上次请求的进行对比,只要有任何一个不一致,进行下一步
  2. 发送Get 请求获取新的词库。

综上,ES远程词库的 Server端要支持 HeadGet

官方建议是利用Nginx作为 Server,当然你可自己实现,这里给出一个范例:

范例 1

拼音

其作用是将中文全部转换为拼音,详情可以参考如下文档

https://github.com/medcl/elasticsearch-analysis-pinyin

骐骥一跃,不能十步。驽马十驾,功在不舍。