背景
在使用elasticsearch的过程中,总会遇到与分词相关的需求,这里将针对常用的elasticsearch hanlp(后面统称为 es hanlp)分词插件进行讲解演示配置自定义业务字典,提高es hanlp分词的准确性,同时也提高查询效率。关于es hanlp的下载安装可以参考文章:https://developer.aliyun.com/article/1162376
自定义词典配置
新增自定义词典
es hanlp默认的字典配置路径是ES_HOME/plugins/analysis-hanlp/data/dictionary/custom,因此在ES_HOME/plugins/analysis-hanlp/data/dictionary/custom目录中新增自定义词典,这里为了不改变es hanlp插件原始的词典内容,因此需要新增业务关键词词典dongao.txt,里面可以加入业务相关的词
修改hanlp.properties
找到hanlp.properties配置文件路径ES_HOME/config/analysis-hanlp
修改hanlp.properties,修改CustomDictionaryPath,增加自定义词典配置
这里分号后面加【空格】的意思就等于是
data/dictionary/custom/dongao.txt;
省略了前面的路径部分。
自动加载词典
配置完成自定义词典后,无需重启es,等待1分钟后,词典自动加载。
加载完成之后我们可以开始测试是否生效。
注:每个节点都需要做上述更改
自定义词典测试
1.当没有配置自定义词典的时候我们测试
POST _analyze { "text": "普通合伙人", "analyzer": "hanlp"}
返回结果是
{ "tokens" : [ { "token" : "普通", "start_offset" : 0, "end_offset" : 2, "type" : "a", "position" : 0 }, { "token" : "合伙人", "start_offset" : 2, "end_offset" : 5, "type" : "nnt", "position" : 1 } ] }
返回结果的截图
2.这时我们给自定义词典dongao.txt增加业务专有名词 【普通合伙人】
[root@dev3-test-java-22.190 /elk6.7.1/elasticsearch-6.7.1/plugins/analysis-hanlp/data/dictionary/custom]#vim dongao.txt [root@dev3-test-java-22.190 /elk6.7.1/elasticsearch-6.7.1/plugins/analysis-hanlp/data/dictionary/custom]#cat dongao.txt 普通合伙人
等待1分钟,
[2023-02-16T17:24:21,451][INFO ][c.h.d.ExtMonitor ] [ei-test-es-node190] reloading hanlp custom dictionary [2023-02-16T17:24:22,436][INFO ][o.e.m.j.JvmGcMonitorService] [ei-test-es-node190] [gc][young][732][58] duration [713ms], collections [1]/[1.6s], total [713ms]/[7.2s], memory [1.6gb]->[1.1gb]/[2gb], all_pools {[young] [701mb]->[0b]/[0b]}{[survivor] [3mb]->[0b]/[0b]}{[old] [954.6mb]->[1.1gb]/[2gb]} [2023-02-16T17:24:22,436][INFO ][o.e.m.j.JvmGcMonitorService] [ei-test-es-node190] [gc][732] overhead, spent [713ms] collecting in the last [1.6s] [2023-02-16T17:24:41,695][INFO ][o.e.c.r.a.DiskThresholdMonitor] [ei-test-es-node190] low disk watermark [85%] exceeded on [cbwVMU6UTACFPxKW0zkOcw][ei-test-es-node190][/es-data/nodes/0] free: 6.1gb[14.8%], replicas will not be assigned to this node[2023-02-16T17:24:47,423][INFO ][c.h.d.c.DictionaryFileCache] [ei-test-es-node190] begin write down hanlp custom dictionary file cache, file path: /elk6.7.1/elasticsearch-6.7.1/plugins/analysis-hanlp/hanlp.cache, custom dictionary file list: [DictionaryFile{path='plugins/analysis-hanlp/data/dictionary/custom/CustomDictionary.txt', lastModified=1668667063000}, DictionaryFile{path='plugins/analysis-hanlp/data/dictionary/custom/Accounting.txt', lastModified=1668668268000}, DictionaryFile{path='plugins/analysis-hanlp/data/dictionary/custom/ModernChineseSupplementaryWord.txt', lastModified=1543232260000}, DictionaryFile{path='plugins/analysis-hanlp/data/dictionary/custom/ChinesePlaceName.txt', lastModified=1543232260000}, DictionaryFile{path='plugins/analysis-hanlp/data/dictionary/custom/PersonalName.txt', lastModified=1543232260000}, DictionaryFile{path='plugins/analysis-hanlp/data/dictionary/custom/OrganizationName.txt', lastModified=1543232260000}, DictionaryFile{path='plugins/analysis-hanlp/data/dictionary/custom/ShanghaiPlaceName.txt', lastModified=1543232260000}, DictionaryFile{path='plugins/analysis-hanlp/data/dictionary/custom/dongao.txt', lastModified=1676539442000}, DictionaryFile{path='plugins/analysis-hanlp/data/dictionary/person/nrf.txt', lastModified=1542195182000}] [2023-02-16T17:24:47,424][INFO ][c.h.d.c.DictionaryFileCache] [ei-test-es-node190] write down hanlp custom dictionary file cache successfully [2023-02-16T17:24:47,424][INFO ][c.h.d.ExtMonitor ] [ei-test-es-node190] finish reload hanlp custom dictionary
自定义词典加载完成后再次测试
如果测试过程中没有生效的话,建议重启es后再次测试即可,为了防止重启es影响业务进行,建议提前准备好业务关键词,一次性添加进入你的自定义词典dongao.txt然后重启es,这里还有一点需要注意的是,如果你新增自定义词典内容,重启es后对应的新增内容会实现,如果删除之前增加的自定义词典,建议先删除CustomDictionary.txt.bin
文件之后再重启es,因为CustomDictionary.txt.bin这个文件类似于一个缓存文件,为了防止干扰正常词匹配,删除该文件之后再重启es更稳妥。