Elasticsearch - 中文分词器的集成与使用教程2(增加停用词、自定义词库)
一、增加停用词
1,IK 分词器默认效果
(1)下面命令使用 IK 分词器测试中文分词效果:
1 | curl - XPOST "http://node1:9200/emp/_analyze?pretty" - H 'Content-Type: application/json' - d '{"text":"我们是中国人","tokenizer":"ik_max_word"}' |
(2)返回的结果如下,可以看到在分出来的词语中有一个“是”,这个词语其实可以被认为是一个停用词,在分词时是不需要切分出来的。在这里被切分出来了,那也就意味着,IK 分词器在过滤停用词时没有把它过滤掉。
2,在 IK 分词器中增加停用词
(1)IK 分词器的停用词默认在 stopword.dic 这个词库文件中,在这个文件中目前都是一些英文停用词。
(2)我们可以编辑 stopword.dic 这个词库文件,把中文停用词添加进去。比如添加“是”这个停用词。
注意:集群里所有节点都需要修改。我们可以修改一个然后使用 scp 命令把这个文件改动同步到集群中的其他节点上。
1 | vi config / analysis - ik / stopword.dic |

(3)接着,重启集群让配置生效。我们再次使用 IK 分词器测试中文分词效果,可以发现“是”已经被作为停用词不再被切分出来了:
1 | curl - XPOST "http://node1:9200/emp/_analyze?pretty" - H 'Content-Type: application/json' - d '{"text":"我们是中国人","tokenizer":"ik_max_word"}' |

二、自定义词库
1,IK 分词器默认效果
(1)对于一些特殊的词语,在分词时也要能够识别到它们,例如公司产品的名称或网络上新流行的词语。比如我们使用 IK 分词器测试分词效果:
1 | curl - XPOST "http://node1:9200/emp/_analyze?pretty" - H 'Content-Type: application/json' - d '{"text":"欢迎访问航歌","tokenizer":"ik_max_word"}' |
(2)结果发现,IK 分词器会把“航歌”分为“航”和“歌”这两个词语。因为这个词语并不是通用的词语,所以 IK 分词器识别不出来也正常。要想让 IK 分词器将“航歌”识别出来,则需要自定义词库了,即把我们自己造的词语添加到词库中。
2,自定义词库文件
(1)我们切换到 es 用户,进入 elasticsearch-analysis-ik 插件对应的配置文件目录,创建一个自定义词库文件 my.dic。
1 2 3 | su es cd config / analysis - ik vi my.dic |
- 然后直接在文件中添加词语,每一个词语一行。
(2)修改 elasticsearch-analysis-ik 插件的配置文件 IKAnalyzer.cfg.xml
1 | vi config / analysis - ik / IKAnalyzer.cfg.xml |
- 我们把 my.dic 词库文件添加到 key="ext_dict" 这个 entry 中。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <? 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" >my.dic</ entry > <!--用户可以在这里配置自己的扩展停止词字典--> < entry key = "ext_stopwords" ></ entry > <!--用户可以在这里配置远程扩展字典 --> <!-- <entry key="remote_ext_dict">words_location</entry> --> <!--用户可以在这里配置远程扩展停止词字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --> </ properties > |
注意事项:
- 切记不要随意新增 entry,随意断增的 entry 是不被 IK 识别的,并且 entry 的名称也不能乱改,否则也不会识别。
- 如果需要指定多个自定义词库文件,则需要使用分号(;)隔开。例如 <entry key="ext_dict">my.dic;your.dic</entry>
- 如果后期想增加自定义停用词库,则按照这个思路进行添加即可,只不过停用词库需要配置到 key="ext_stopwords" 这个 entry 中。
(3)最后将自定义词库文件 my.dic 和修改好的 IKAnalyzer.cfg.xml 配置文件复制到集群中的所有节点中,然后重启集群。
3.验证自定义词库的分词效果
(1)我们再次使用 IK 分词器测试分词效果:1 | curl - XPOST "http://node1:9200/emp/_analyze?pretty" - H 'Content-Type: application/json' - d '{"text":"欢迎访问航歌","tokenizer":"ik_max_word"}' |
(2)现在发现“航歌”这个词语可以被识别出来了,说明自定义词库生效了。
附:常见的中文停用词汇总
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | 的 一 不 在 人 有 是 为 以 于 上 他 而 后 之 来 及 了 因 下 可 到 由 这 与 也 此 但 并 个 其 已 无 小 我 们 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 从 到 得 打 凡 儿 尔 该 各 给 跟 和 何 还 即 几 既 看 据 距 靠 啦 了 另 么 每 们 嘛 拿 哪 那 您 凭 且 却 让 仍 啥 如 若 使 谁 虽 随 同 所 她 哇 嗡 往 哪 些 向 沿 哟 用 于 咱 则 怎 曾 至 致 着 诸 自 |