首先镇这个词已经包含在suffix.dic词典中,不管它在不在词典中,对于ik_max_word而言都是会单独将镇这个词做分词的,ik_max_word是最细粒度的分词,词库中有镇会单独拆分,没有也会单独拆分。
如果想达到你这种索引分词效果,可以这样实现:
1. tokenizer使用ik_smart
2. 在自定义词库中添加理塘和理塘镇这两个词
具体添加方法为:
1. 在config/analysis-ik下新建自定义词库custom.dic
内容如下:
理塘
理塘镇
2. config/analysis-ik/IKAnalyzer.cfg.xml配置文件中增加自己本地扩展词库的路径
修改后的配置文件如下:
<?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.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 key="ext_dict"></entry>改为
<entry key="ext_dict">custom.dic</entry>
来指定本地扩展词库的位置
然后重启ES集群进行验证:
POST _analyze
{
"text": ["我到了理塘镇"],
"analyzer": "ik_smart"
}
从用户体验来分析,如果用户帖子中出现理塘镇,使用理塘搜索应该也需要能够召回,所以这里可以使用ik_max_word分词,再配合match_phrese,或者match and查询来实现会更合理一些