Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

Elasticsearch 同义词库配置及热更新等全解


Elasticsearch 同义词通过专有的同义词过滤器(synonym token filter)来进行工作,它允许在分析(analysis)过程中方便地处理同义词,一般是通过配置文件配置同义词。此外,同义词可以再建索引时(index-time synonyms)或者检索时(search-time synonyms)使用。

配置示例

PUT /test_index
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "my_synonym_analyser": {
            "tokenizer": "whitespace",
            "filter": [ "my_synonym" ]
          }
        },
        "filter": {
          "my_synonym": {
            "type": "synonym",
            "synonyms_path": "analysis/synonym.txt"
          }
        }
      }
    }
  }
}

同义词(synonym)配置语法

如上例子所示,es 同义词配置的 filter 语法具体如下选项:

  • type:指定 synonym,表示同义词 filter;
  • synonyms_path:指定同义词配置文件路径;
  • expand:该参数决定映射行为的模式,默认为 true,表示扩展模式,具体示例如下:
    • expand == true 时,
      ipod, i-pod, i pod
      等价于:
      ipod, i-pod, i pod => ipod, i-pod, i pod

      当 expand == false 时,

      ipod, i-pod, i pod

      仅映射第一个单词,等价于:

      ipod, i-pod, i pod => ipod
  • lenient:如果值为 true 时,遇到那些无法解析的同义词规则时,忽略异常。默认为 false。

同义词文档格式

elasticsearch 的同义词有如下两种形式:

  • 单向同义词:
    ipod, i-pod, i pod => ipod
  • 双向同义词:
    马铃薯, 土豆, potato

单向同义词不管索引还是检索时,箭头左侧的词都会映射成箭头右侧的词;

双向同义词是索引时,都建立同义词的倒排索引,检索时,同义词之间都会进行倒排索引的匹配。 

同义词的文档化时,需要注意的是,同一个词在不同的同义词关系中出现时,其它同义词之间不具有传递性,这点需要注意。

假设如上示例中,如果“马铃薯”和其它两个同义词分成两行写:

马铃薯,土豆
马铃薯,potato

此时,elasticsearch 中不会将“土豆”和“potato”视为同义词关系,所以多个同义词要写在一起,这往往是开发中经常容易疏忽的点。