es的同义词搜索功能经过自定义分析器实现html
咱们知道 一个 分析器 就是在一个包里面组合了三种函数的一个包装器, 三种函数按照顺序被执行:app
char_filter 用于分词前对原搜索的句子进行处理 tokenizer 用于将搜索的句子分红多个词组 filter 用于处理tokenizer输出的词组,好比删除某些词,修改某些词,增长某些词函数
实现同义词搜索的原理是,自定义filter,处理tokenizer输出的待搜索词组时,取出其中词的同义词,加入到待搜索的词组中。code
建立分析器:htm
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文件的格式为每行为一组同义词,每组的同义词格式由以下两种:token
第一种状况下,不管索引番茄或者西红柿,分析器分析结果的词组为['番茄', '西红柿']ip
第二种状况下,不管索引番茄或者西红柿,分析器分析结果的词组为['西红柿']原理
能够经过搜索
GET /synonym/_analyze?analyzer=ik_sync_smart&text=注册
查看同义词结果是否符合需求
而后设置索引数据的mapping时,指定对应搜索字段的analyzer为自定义的ik_sync_smart便可。