Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

elasticsearch(es)如何配置自定义同义词(synonyms)及对应的分析器(analyzer)

Elasticsearch 笔记 Elasticsearch 笔记


在 es 使用中,开发者想配置自身业务中沉淀的同义词(synonyms)表,并基于该同义词库配置包含其的分析器(analyzer),主要分为生成同义词文件配置该同义词 filter 及包含其的分析器使用解析器,三个步骤。

生成同义词文件

同义词内容通过人工整理、word2vector 等算法收集之后,整合到一个文件,每行配置相应的同义词对应表,每个词之间用英文逗号隔开,具体示例如下:

鼻头,鼻尖
鼻子,鼻部
耳朵,耳
二氧化碳,co2
减肥,瘦身

将如上同义词表保存为诸如 my_synonyms.txt 这样的文件,然后将其放置在 elasticsearch 安装文件目录的 config/analysis 相对目录下,笔者是这样的放置的。

配置同义词的 filter 及包含其的 analyzer

这里,首先要明确的是概念是,同义词表在 es 里面属于 analyzer 三个组成部分中的 token filter(其它 2 个是 character filter 和 tokenizer)。

那我们知道它们的关系之后,就明白应该先做同义词的 token filter 配置了,其后,将该 filter 包含在新定义的 analyzer 即可,这些都配置在 settings 下面,具体实例如下:

{
  "my_index": {
    "settings": {
      "index": {
        "analysis": {
          "filter": {
            "my_synonym": {
              "type": "synonym",
              "synonyms_path": "analysis/my_synonyms.txt"
            }
          },
          "analyzer": {
            "ik_max_word_mysynonym": {
              "filter": [
                "mysynonym",
                "standard",
                "lowercase",
                "stop"
              ],
              "tokenizer": "ik_max_word"
            },
            "ik_smart_mysynonym": {
              "filter": [
                "mysynonym",
                "standard",
                "lowercase",
                "stop"
              ],
              "tokenizer": "ik_smart"
            }
          }
        }
      }
    }
  }
}

上面实例进一步解释的话,分词器 tokenizer 是使用的 es-ik 插件安装好的(ik_smart 和 ik_max_word),standard、lowercase、stop 是 es 内置的 token filter,自定义的同义词过滤器叫 my_synonym。

使用分析器

我们来到最后一步,如何使用已配置好的带有同义词的分析器,主要有两种方式,一个是在索引 mapping 里对应的字段里指定搜索和索引时的分析器,另一个是在搜索 query 里现指定分析器。

{
  "my_index": {
    "mappings": {
      "my_type": {
        "properties": {
          "content": {
            "type": "text",
            "store": true,
            "similarity": "BM25",
            "analyzer": "ik_max_word_mysynonym",
            "search_analyzer": "ik_smart_mysynonym"
          },
          ...
        }
      }
    }
  }
}

上面例子给出了 index 里 content 字段对应的索引时的分析器是 ik_max_word_mysynonym,搜索时的分析器是 ik_smart_mysynonym

如果想在查询时指定分析器,可以参考如下示例:

GET my_index/_search
{
  "query": {
    "multi_match": {
      "query": "鼻头",
      "fields": ["content"],
      "analyzer": "ik_smart_mysynonym"
    }
  }
}