ElasticSearch - 基礎概念和對映

王谷雨發表於2024-03-19

前言

寫這篇東西,是因為官方文件看著太痛苦,於是乎想用大白話來聊聊 ElasticSearc (下面都簡稱ES)。所以下文對於 ES 一些概念的表述可能會與官方有出入,所以需要準確的表述和詳細定義的,請跳轉官方文件。我也儘量貼上官方的連結。

前置知識:因為下文會使用 mysql 的一些概念來描述,所以沒學過的不建議看文字。

本文基於 ES 8.12

ES 基礎概念

ES 是一個搜尋引擎。重點是大資料搜尋,如果是傳統的 CRUD,請考慮關係型資料庫。

下面來了解幾個 ES 的基礎概念

索引(index)

Index modules | Elasticsearch Guide [8.12] | Elastic

類比 mysql 的表,但又與表有很大區別

mysql:建立表需要先定義表欄位,再進行資料插入。並且如果新增新欄位,需要先修改表結構,再進行資料插入。

ES:索引無需預先定義欄位(ES 裡面叫對映),可在插入資料時動態新增欄位(這叫動態對映,後面講)

文件型別(type)

ES7 開始,文件型別只有預設的 _doc 了,我沒用過舊版,所以略...

文件(document)

類比 mysql 的表的一條資料。

對映(mapping)

Mapping | Elasticsearch Guide [8.12] | Elastic

類比 mysql 的表欄位,不同型別的欄位,儲存和查詢會有區別

檢視索引的對映

-- 檢視對映(索引名為 my-index 的對映)
GET /my-index/_mappings
-- 檢視對映的某個欄位(索引名為 my-index 的欄位 age 的對映)
GET /my-index/_mapping/field/age

動態對映

Dynamic field mapping | Elasticsearch Guide [8.12] | Elastic

ES 與傳統關係型資料庫不同,建立索引(類比 mysql 的表)時,不需要指定欄位,在插入資料時,會自動建立欄位和判斷欄位的型別,這就是動態對映。

動態對映預設的開啟的,可以透過 dynamic 引數來修改。dynamic | Elasticsearch Guide [8.12] | Elastic

以下是不同 dynamic 引數對 json 資料型別的對映

JSON 資料型別 dynamic: true dynamic: runtime
null No field added No field added
true or false boolean boolean
double float float
long long long
object object No field added
array 取決於陣列中的第一個非 null 值 取決於陣列中的第一個非 null 值
日期型別的 string date date
數字型別的 string float or long double or long
其他型別的 string text with a .keyword sub-field keyword

注意:預設的數字檢測是關閉的,也就是在 沒有對映 的情況下,插入 666 字串是識別的成字串的。如果已經配置了對映欄位是 long 型別,插入 666 字串才會被識別為數字

日期檢測:
預設的日期檢測格式有 yyyy/MM/dd HH:mm:ss||yyyy/MM/dd
也就是 2024/01/01 12:00:00 或者 2024/01/01 ,但是 2024-01-01 格式也行, 2024-01-01 12:00:00 不可以

自定義日期檢測

PUT my-index
{
  "mappings": {
    "dynamic_date_formats": [ "yyyy/MM", "MM/dd/yyyy"]
    // 或者用
    "dynamic_date_formats": [ "yyyy/MM|MM/dd/yyyy"]
  }
}

兩者的區別在於,[ "yyyy/MM", "MM/dd/yyyy"] 第一次插入資料,匹配到哪種,以後都用這種檢測。而 [ "yyyy/MM|MM/dd/yyyy"] 則是兩種格式都能用

顯式對映

建立索引時新增對映

不需要搜尋的欄位,建議用 index: false 屬性
index | Elasticsearch Guide [8.12] | Elastic

PUT /my-index
{
  "mappings": {
    "properties": {
      "age":    { "type": "integer" },  
      "email":  { "type": "keyword" , "index": false }, 
      "name":   { "type": "text"  }     
    }
  }
}

向現有對映新增欄位

PUT /my-index/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
  }
}

修改現有對映

除了支援的對映引數外,您不能更改現有欄位的對映或欄位型別。更改現有欄位可能會使已索引的資料無效。

如果需要更改欄位的對映,請使用正確的對映建立一個新索引,並將資料重新索引到該索引中。

說人話就是:ES 是用來搜尋的,官方不建議修改欄位對映。不比關聯式資料庫,ES 更改欄位的對映很麻煩,跟重新建一個索引把資料導進去差不多(官方也建議這麼玩)

總結

本文用大白話講了 ES 的幾個基本概念和對映的操作,旨在讓小白能快速瞭解 ES,如果文章有錯誤的地方,歡迎評論區指出。

參考資料

Elasticsearch Mapping型別修改 - 知乎 (zhihu.com)

相關文章