20 elasticsearch的同义词功能 - xiaoxin01/Blog GitHub Wiki

本文介绍如何使用elasticsearch上的同义词功能

同义词在搜索场景中是非常重要的功能,好在ELK平台已经提供了同义词功能供我们使用。

《Elasticsearch: 权威指南》中也对同义词做了详细的说明

同义词的设定有两种方法:

  1. 直接通过 synonyms 指定
"filter" : {
    "synonym" : {
        "type" : "synonym",
        "lenient": true,
        "synonyms" : ["foo, bar, baz"]
    }
}
  1. 通过 synonyms_path 指定一个包含同义词的文件
"filter" : {
    "synonym" : {
        "type" : "synonym",
        "synonyms_path" : "analysis/synonym.txt"
    }
}

对于第1种方法,优点是不用在server上建立单独的文件就可以创建同义词,缺点是当同义词更新时,需要发送指令修改index settings才能更改同义词,如果index非常多或者是通过模板建立,就需要逐一更新这些index,较耗时

对于第2种方法,优点就是没有上述的缺点带来的问题,缺点是需要在server上建立文件,而且如果server是集群,则需要保证每台server上都有同义词文件

同义词的实现方式

同义词可以通过下面3种方式实现:

  1. 简单扩展:"jump,hop,leap"
  2. 简单收缩:"leap,hop => jump"
  3. 类型扩展:"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"
        }
      },{
    ...

参考

⚠️ **GitHub.com Fallback** ⚠️