es的同义词搜索功能通过自定义分析器实现
我们知道 一个 分析器 就是在一个包里面组合了三种函数的一个包装器, 三种函数按照顺序被执行:
- char_filter 如:emoticons, html_strip等
- tokenizer 如:standard, ik_smart等
- filter 如:lowercase,english_stop等
char_filter 用于分词前对原搜索的句子进行处理 tokenizer 用于将搜索的句子分成多个词组 filter 用于处理tokenizer输出的词组,比如删除某些词,修改某些词,增加某些词
实现同义词搜索的原理是,自定义filter,处理tokenizer输出的待搜索词组时,取出其中词的同义词,加入到待搜索的词组中。
创建分析器:
PUT /synonym
{
"settings": {
"analysis": {
"filter": {
"word_sync": {
"type": "synonym",
"synonyms_path": "analysis/synonyms.txt"
}
},
"analyzer": {
"ik_sync_smart": {
"filter": [
"word_sync"
],
"type": "custom",
"tokenizer": "ik_smart"
}
}
}
}
}
上面的例子在名为synonym的index下面创建了个名为ik_sync_smart的分析器,改分析器的tokenizer为ik_smart, filter为word_sync. word_sync是自定义filter,这个filter的type是synonym,synonyms_path是指定的同义词词典的路径,这个路径在config下面,所以我们需要在config路径下面增加analysis目录,里面增加synonyms.txt文件
synonyms.txt文件的格式为每行为一组同义词,每组的同义词格式由如下两种:
- 番茄,西红柿
- 番茄,西红柿 => 西红柿
第一种情况下,无论索引番茄或者西红柿,分析器分析结果的词组为['番茄', '西红柿']
第二种情况下,无论索引番茄或者西红柿,分析器分析结果的词组为['西红柿']
可以通过
GET /synonym/_analyze?analyzer=ik_sync_smart&text=注册
查看同义词结果是否符合需求
扫描二维码关注公众号,回复:
98226 查看本文章
然后设置索引数据的mapping时,指定对应搜索字段的analyzer为自定义的ik_sync_smart即可。