20 elasticsearch的同义词功能 - xiaoxin01/Blog GitHub Wiki
本文介绍如何使用elasticsearch上的同义词功能
同义词在搜索场景中是非常重要的功能,好在ELK平台已经提供了同义词功能供我们使用。
在《Elasticsearch: 权威指南》中也对同义词做了详细的说明
- 直接通过 synonyms 指定
"filter" : {
"synonym" : {
"type" : "synonym",
"lenient": true,
"synonyms" : ["foo, bar, baz"]
}
}
- 通过 synonyms_path 指定一个包含同义词的文件
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "analysis/synonym.txt"
}
}
对于第1种方法,优点是不用在server上建立单独的文件就可以创建同义词,缺点是当同义词更新时,需要发送指令修改index settings才能更改同义词,如果index非常多或者是通过模板建立,就需要逐一更新这些index,较耗时
对于第2种方法,优点就是没有上述的缺点带来的问题,缺点是需要在server上建立文件,而且如果server是集群,则需要保证每台server上都有同义词文件
同义词可以通过下面3种方式实现:
- 简单扩展:"jump,hop,leap"
- 简单收缩:"leap,hop => jump"
- 类型扩展:"cat => cat,pet"
详细说明可参见 扩展和搜索
实际应用过程中,同义词可能是会发生变化的,如果索引的资料较多,希望在不重新索引的前提下让新的同义词生效,则可以考虑使用:
- 在查询阶段使用简单扩展
- 在索引和查询阶段使用简单收缩
- 在查询阶段使用类型扩展
设定同义词
"analysis": {
"analyzer": {
"analyzer_with_synonym": {
"filter": [
"synonym_filter"
],
"char_filter": [
],
"type": "custom",
"tokenizer": "ik_max_word"
}
}
"filter": {
"synonym_filter": {
"type": "synonym",
"synonyms_path" : "analysis/synonym.txt"
}
}
}
在查询阶段使用简单扩展:
"query": {
"bool": {
"must":[{
"query_string": {
"fields" : ["title^2", "content"],
"query" : "ref",
"default_operator": "AND",
"analyzer": "analyzer_with_synonym"
}
},{
...