前言
寫這篇東西,是因為官方文件看著太痛苦,於是乎想用大白話來聊聊 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)