在 Elasticsearch 中,索引字段的類型(即 Mapping 中的字段類型)對搜索和存儲性能影響很大。下面是各種常用數據類型的用途及推薦使用場景總結:
1. keyword
類型(精確匹配)
-
適合數據:
- 不需要分詞,直接用于過濾、排序、聚合等操作的數據。
-
常見字段:
- 用戶 ID、手機號、身份證、訂單號、狀態碼、城市名稱、標簽、分類名、性別、IP、UUID 等。
-
說明:
keyword
是不可被分詞的,整體作為一個字符串處理,支持term
查詢、terms
查詢、terms aggregation
聚合等。
例子:
"user_id": { "type": "keyword" }
"status": { "type": "keyword" }
2. text
類型(分詞全文檢索)
-
適合數據:
- 需要做全文搜索(模糊搜索、關鍵詞搜索)的字段。
-
常見字段:
- 評論內容、商品標題、文章內容、日志描述等。
-
說明:
- 默認會使用 analyzer 分詞器進行分詞處理,適合搜索但不適合做聚合或排序。
🔸 例子:
"title": { "type": "text" }
"comment": { "type": "text" }
組合用法:
text + keyword
(一個字段兩個視圖)
"username": {"type": "text","fields": {"keyword": { "type": "keyword" }}
}
這樣 username
可以分詞搜索,也可以用 username.keyword
精確匹配、排序、聚合。
3. integer
/ long
/ float
/ double
-
適合數據:
- 數值類型字段,如金額、數量、分數、時間戳等。
-
常見字段:
- 年齡、價格、庫存、評分、時間戳(可用
long
表示)、緯度經度等。
- 年齡、價格、庫存、評分、時間戳(可用
-
建議選擇:
integer
:32位整數,適合一般數值;long
:64位整數,如毫秒時間戳;float
/double
:浮點類型,有精度要求時用double
。
🔸 例子:
"price": { "type": "double" }
"timestamp": { "type": "long" }
4. date
-
適合數據:
- 任何格式化的日期時間,比如創建時間、更新時間、登錄時間等。
-
常見字段:
createTime
,updateTime
,logTime
-
說明:
- 支持范圍查詢和時間聚合;
- 可以通過
format
指定日期格式。
🔸 例子:
"create_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||epoch_millis" }
5. boolean
-
適合數據:
- true/false 類型,如是否刪除、是否啟用等。
🔸 例子:
"is_deleted": { "type": "boolean" }
6. nested
-
適合數據:
- 對象數組結構,需要對數組中每個對象進行獨立查詢時使用。
🔸 例子(用戶有多個訂單):
"orders": {"type": "nested","properties": {"order_id": { "type": "keyword" },"amount": { "type": "double" }}
}
7. object
-
適合數據:
- 簡單對象結構(非數組),如 address。
🔸 例子:
"address": {"type": "object","properties": {"province": { "type": "keyword" },"city": { "type": "keyword" }}
}
不推薦的數據類型(謹慎使用)
類型 | 說明 |
---|---|
text 做聚合或排序 | 會報錯,需要用 keyword |
大文本字段 | 用 text ,并避免在 UI 上分頁返回 |
非結構化 JSON | 不推薦嵌套太深的結構體,會影響性能 |
總結推薦表
數據類型 | 推薦映射類型 | 用途 |
---|---|---|
用戶名 | text + keyword | 模糊搜索 + 精準聚合 |
狀態碼 | keyword | 精確過濾 |
評論內容 | text | 分詞搜索 |
創建時間 | date | 時間范圍查詢 |
價格/分數 | double | 數值計算 |
是否刪除標識 | boolean | 布爾條件 |
時間戳 | long | 毫秒時間 |
地址結構體 | object | 結構化字段 |
對象數組(如訂單) | nested | 嵌套多值數組 |