如果你也曾在 Elasticsearch 查詢時遇過這種疑惑——「為什麼有些欄位能聚合、有些卻不行?」 「LIKE "*python*" 在某些欄位能搜尋,在另一些卻沒結果?」
那你一定要看完這篇
ES 7.x 之後,string 類型被拆分成兩種用途明確的新型別:
text 用於 全文檢索(Full-text Search)
keyword 用於 精確匹配(Exact Search)與聚合(Aggregation)
這篇文章會幫你一次釐清它們的差別、實際應用場景與最佳實踐!
為什麼會有 Text 與 Keyword 之分?
在舊版 Elasticsearch 裡,所有字串都是 string 類型。
但這樣的設計導致模糊搜尋與聚合分析互相衝突。
官方將字串類型拆為:
- text:經過分詞(tokenized),可進行全文檢索。
- keyword:不分詞,適合精確比對與聚合分析。
1. Text 類型 — 為全文搜尋而生
用途
text 類型適合儲存「自然語言」內容,如日誌訊息、描述文字、文章內文。它會先經過 Analyzer(分析器) 斷詞,再建立索引。
屬性 說明
是否分詞 會分詞
查詢方式 支援模糊、全文查詢
是否支援聚合 不支援
適用場景 日誌內容、文字描述等需全文搜索的欄位
範例
SELECT crond_message
FROM cwb-linux
WHERE crond_message LIKE '*python*'
AND @timestamp BETWEEN '2022-12-16T00:35:38.831Z' AND '2022-12-20T10:35:38.831Z'
LIMIT 10000
對應的 mapping:
"crond_message": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
小提示:
Elasticsearch 預設會幫 text 欄位建立一個 .keyword 子欄位,用於精確匹配。
2. Keyword 類型 — 精確匹配與聚合分析的主角
用途
keyword 適合儲存「結構化」字串,例如:主機名稱、ID、IP、分類、標籤等。
屬性 說明
是否分詞 不分詞
查詢方式 精確匹配或 wildcard 模糊查詢
是否支援聚合 支援
適用場景 ID、名稱、類別、標籤等需統計或篩選的欄位
範例
SELECT host.hostname
FROM iis-w3c-*
WHERE host.hostname LIKE '*IIS*'
LIMIT 10000
對應的 mapping:
"host": {
"properties": {
"hostname": { "type": "keyword" },
"ip": { "type": "keyword" },
"os": {
"properties": {
"name": { "type": "keyword" },
"version": { "type": "keyword" }
}
}
}
}
Text vs Keyword 一覽表
屬性 text keyword
是否分詞 是 否
精確查詢 需用 .keyword 直接支援
模糊查詢(wildcard) 有限支援 支援
聚合(Aggregation) 不支援 支援
適用場景 文章內容、訊息 ID、主機名、分類
檢索類型 全文檢索 精確匹配、統計
結語:如何選擇才對?
選擇 text 或 keyword 並不是非黑即白。
最好的做法是根據使用場景設計 mapping:
- 若你想搜尋「內容包含 XXX」:選
text - 若你想問「這台主機出現幾次」:選
keyword
清楚區分兩者的行為,就能避免查詢結果錯誤、聚合失敗、或前端判斷複雜的問題。
















