Elasticsearch学习笔记6: 同义词搜索实现

es的同义词搜索功能通过自定义分析器实现

我们知道 一个 分析器 就是在一个包里面组合了三种函数的一个包装器, 三种函数按照顺序被执行:

  1. char_filter 如:emoticons, html_strip等
  2. tokenizer 如:standard, ik_smart等
  3. 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文件的格式为每行为一组同义词,每组的同义词格式由如下两种:

  1. 番茄,西红柿
  2. 番茄,西红柿 => 西红柿

第一种情况下,无论索引番茄或者西红柿,分析器分析结果的词组为['番茄', '西红柿']

第二种情况下,无论索引番茄或者西红柿,分析器分析结果的词组为['西红柿']

可以通过

GET /synonym/_analyze?analyzer=ik_sync_smart&text=注册

查看同义词结果是否符合需求

扫描二维码关注公众号,回复: 98226 查看本文章

然后设置索引数据的mapping时,指定对应搜索字段的analyzer为自定义的ik_sync_smart即可。

猜你喜欢

转载自my.oschina.net/u/2299936/blog/1800461