Elasticsearch 中的 Synonym Token Filter 与 Mapping Char Filter 的区别

  1. 首先这两个的类型不一样,Synonym 是一种 Token Filter,而 Mapping 是一种 Character Filter。app

  2. 基于上述第一点描述,能够知道二者的执行顺序也不一样。因为在 analyzer 分析的过程当中先执行 Character Filter 进行字符处理,再执行 Tokenizers 进行分词,最后执行 Token Filters 对分词进行处理。因此先执行 Mapping ,后执行 Synonym 。spa

  3. 在概念上不一样,Synonym 是用来处理同义词的,而 Mapping 是用来处理 key 和对应的 value 转换(我的感受其实不考虑概念的话,这两个某种程度上差很少)。code

  4. 在用法上不一样,Synonym 能够使用如下几种方式:token

    "synonyms" : ["你们好,你好 => hello",
                  "咱们 => we, us",
                  "可可,keke,hehe"]
    复制代码

    而 Mapping 则只能使用如下方式:it

    "mappings": [
                   "哈哈 => 呵呵",
                   ":( => 生气"
                 ]
    复制代码
  5. 二者能够组合使用,以下:io

    PUT /test_index
     {
         "settings": {
             "index" : {
                 "analysis" : {
                     "analyzer" : {
                         "my_analyzer" : {
                             "tokenizer" : "standard",
                             "filter" :  "synonym",
                             "char_filter": "my_char_filter"
                         }
                     },
                     "char_filter": {
                       "my_char_filter": {
                         "type": "mapping",
                         "mappings": [
                           "hi => 你们好",
                           "<:> => 咱们"
                         ]
                       }
                     },
                     "filter" : {
                         "synonym" : {
                             "type" : "synonym",
                             "lenient": true,
                             "synonyms" : ["你们好,你好 => hello",
                                           "咱们 => we, us",
                                           "可可,keke,hehe"]
                         }
                     }
                 }
             }
         }
     }
    复制代码

在终端 kibana 执行如下代码:class

GET /test_index/_analyze
{
  "text": "<:>你们庭",
  "analyzer": "my_analyzer"
}
复制代码

获得以下结果:test

{
  "tokens" : [
    {
      "token" : "we",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "SYNONYM",
      "position" : 0
    },
    {
      "token" : "us",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "SYNONYM",
      "position" : 0
    },
    {
      "token" : "大",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "家",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "庭",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    }
  ]
}
复制代码

能够看到 <:> 先经过 Mapping 转换成了“咱们”,而后又经过 Synonym 转换成了 "we" 和 "us" 。终端

相关文章
相关标签/搜索