2019独角兽企业重金招聘Python工程师标准>>>
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=注册
查看同义词结果是否符合需求
然后设置索引数据的mapping时,指定对应搜索字段的analyzer为自定义的ik_sync_smart即可。