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" 。終端

相關文章
相關標籤/搜索