Elasticsearch Mapping 原理及範例說明

Elasticsearch Mapping 原理及範例說明

Mapping 類似於資料庫中的 schema,主要的作用如下:

  • 定義類型 (bool, string, num…)
  • 設定屬性倒排索引

在 Elasticsearch 數據產生時,其實都自動進行 mapping,但有時如果有特別的業務需求,則可以自行設定 mapping ,

特別提醒!如果特別需求,請在一開始就建立好 Mapping,因為Mapping建立後,就不能修改。

(另外,後續會在提到如何透過 Index Aliases 來作為 Interface ,更好的讓 index 有 v1, v2… 多版本時,可以統一由 Aliases 作為介面,只要在建立新版本 index 及資料移轉完成後,將Aliases 指向新的 index 即可。)

起手式,一個 Mapping 基本定義的方式如下:

PUT poc-trylog
{
  "mappings": {
    //define your mappings
  }
}

通常,自行定義 Mapping 會建議將一個樣本寫入到一個臨時的索引,ES 就會自動產生 mapping ,

例如,我們建立一個新的 index 以及放入內容

POST try-mappings/_doc/1
{
  "name":"brown",
  "phone":"0999333333",
  "age":18,
  "birth":"2020-01-01",
  "members":"true"
}

取得 Mapping 結構

取得 try-mapping 的 mapping 方式如下:

GET try-mappings/_mapping

得到的 Mapping 結果為

{
  "try-mappings" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "birth" : {
          "type" : "date"
        },
        "members" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "phone" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

基本上大部分結構都沒問題,但是 members 其實是布林值,因此在這裡必須要修改一下 mapping

但是如果這時直接修改,會發生錯誤訊息:

刪除索引

因此,要留意的是,必須在一開始就設定好 mapping

我們先手動刪除掉索引,再重新建立 Mapping

刪除索引:

DELETE try-mappings

輸出結果:

{
  "acknowledged" : true
}

手動建立 Mapping

在一開始先手動建立 Mapping

PUT try-mappings
{
  "mappings": {
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "birth" : {
          "type" : "date"
        },
        "members" : {
          "type" : "boolean"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "phone" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
    }
  }
}

接著我們再新增一筆數據

POST try-mappings/_doc/1
{
  "name":"brown",
  "phone":"0999333333",
  "age":18,
  "birth":"2020-01-01",
  "members":"true"
}

查看 mapping 結果

GET try-mappings/_mapping

輸出結果,就可以看到 members 的 type 已經變成. boolean

關於 Mapping keyword

Mapping 其中一個類型是 keyword ,keyword 是不會被收錄到分詞處理(可參考: Elasticsearch Analyzer 分詞器是什麼?實際範例演練)

所以,在 keyword 只要放入內容,Elasticsearch 就會直接將內容完整儲存。

例如:

PUT try-mappings
{
  "mappings": {
      "properties" : {
        "name" : {
          "type" : "keyword"
        }
    }
  }
}

Mapping index

Mapping 的 index 屬性為 boolean,可以指定該屬性是否能夠被倒排索引

例如,以下的 name 欄位設定 index 為false,該欄位就不能被搜尋:

PUT try-mappings
{
  "mappings": {
      "properties" : {
        "name" : {
          "type" : "text",
          "index": false
        }
    }
  }
}

Mapping 的 Null value,允許空值

在正常情況下,某些數據如果是 null 將無法被搜尋, 因此這情況可以在 mapping 指定 ```null_value`` 在搜尋時,不能用空值查詢,而是要用 “null” 來查詢

CVT2HUGO:  null,並且要留意不能在 text 設定,只能在 keyword 設置
PUT try-mappings
{
  "mappings": {
      "properties" : {
        "name" : {
          "type" : "keyword",
          "null_value": "null"
        }
    }
  }
}