Elasticsearch RESTful API入門:基礎搜索與查詢DSL
本文為Elasticsearch初學者詳細解析RESTful API的核心操作與查詢DSL語法,包含大量實戰示例及最佳實踐。
一、Elasticsearch與RESTful API簡介
Elasticsearch(ES)作為分布式搜索分析引擎,其RESTful API是與集群交互的核心方式。通過HTTP協議實現:
- ? 索引文檔的CRUD操作
- ? 執行復雜的搜索查詢
- ? 獲取集群健康狀況
- ? 管理索引生命周期
核心概念速覽:
概念 | 說明 | 類比關系型數據庫 |
---|---|---|
索引(Index) | 文檔的集合 | 數據庫的表 |
文檔(Document) | JSON格式的基本數據單元 | 表中的一行記錄 |
分片(Shard) | 索引的水平分割單元 | 表分區 |
映射(Mapping) | 定義文檔字段及類型 | 表結構定義 |
二、基礎API操作實戰
1. 索引管理
# 創建索引
PUT /products
{"settings": {"number_of_shards": 3,"number_of_replicas": 1},"mappings": {"properties": {"name": {"type": "text"},"price": {"type": "float"},"category": {"type": "keyword"},"created_at": {"type": "date"}}}
}# 刪除索引 (謹慎操作!)
DELETE /products### 2. 文檔操作```bash
# 添加文檔
POST /products/_doc/1001
{"name": "無線藍牙耳機","price": 299.0,"category": "電子產品","created_at": "2023-05-10"
}# 獲取文檔
GET /products/_doc/1001# 更新文檔
POST /products/_update/1001
{"doc": {"price": 259.0}
}# 刪除文檔
DELETE /products/_doc/1001
三、搜索API核心機制
1. 搜索端點
所有搜索請求發送到_search端點:
GET /products/_search
2. 兩種查詢方式對比
方式 | 語法示例 | 適用場景 |
---|---|---|
URL參數查詢 | ?q=category:電子產品 | 快速簡單查詢 |
DSL請求體查詢 | JSON結構描述復雜查詢邏輯 | 生產環境推薦使用 |
四、查詢DSL深度解析
1. 全文搜索 - match查詢
GET /products/_search
{"query": {"match": {"name": {"query": "降噪耳機","operator": "and"}}}
}
-
對文本 分詞處理 ( “降噪耳機” → [“降噪”,“耳機”])
-
operator參數:and(必須全部包含) 或 or(包含任意詞)
2. 精確匹配 - term查詢
GET /products/_search
{"query": {"term": {"category.keyword": {"value": "電子產品"}}}
}
-
注意使用.keyword子字段進行未分詞的精確匹配
-
適用于狀態、標簽等離散值字段
3. 范圍查詢 - range
GET /products/_search
{"query": {"range": {"price": {"gte": 200,"lte": 500}}}
}
-
支持操作符:
gt
(>),gte
(>=),lt
(<),lte
(<=) -
適用于數值、日期范圍過濾
4. 布爾組合 - bool查詢
GET /products/_search
{"query": {"bool": {"must": [{"match": {"name": "耳機"}}],"should": [{"term": {"category.keyword": "促銷品"}},{"range": {"price": {"lte": 199}}}],"must_not": [{"term": {"brand.keyword": "A品牌"}}],"filter": [{"term": {"in_stock": true}}],"minimum_should_match": 1}}
}
子句 | 作用 | 是否影響相關性評分 |
---|---|---|
must | 必須滿足,相當于AND | 是 |
should | 應該滿足,相當于OR | 是 |
must_not | 必須不滿足,相當于NOT | 否 |
filter | 必須滿足,但不參與評分 | 否 |
5. 短語搜索 - match_phrase
GET /products/_search
{"query": {"match_phrase": {"description": {"query": "高清防水","slop": 3}}}
}
-要求詞語 按順序完整出現
-slop參數允許中間間隔的詞數
五、搜索結果處理技巧
1. 分頁與排序
GET /products/_search
{"from": 10,"size": 5,"sort": [{"price": {"order": "asc"}},{"_score": {"order": "desc"}}],"query": {...}
}
2. 字段過濾
GET /products/_search
{"_source": ["name", "price"],"query": {...}
}
3. 結果分析
典型搜索結果結構:
{"took": 15, // 查詢耗時(ms)"timed_out": false,"hits": {"total": {"value": 42, // 匹配總數"relation": "eq"},"max_score": 1.234, // 最高得分"hits": [ // 結果數組{"_index": "products","_id": "1001","_score": 1.234,"_source": { // 原始文檔"name": "無線藍牙耳機","price": 299.0}}]}
}
六、最佳實踐與避坑指南
-
精確匹配陷阱
?字符串字段默認同時創建text
和keyword
類型,精確匹配需用字段名.keyword
-
性能優化
"bool": {"filter": [ // 不參與評分的條件放filter{"range": {"created_at": {"gte": "now-30d/d"}}}]
}
- 深度分頁問題
?避免使用from+size
處理超過10,000條的結果集,改用search_after
或scrollAPI
- 安全防護
?生產環境必須啟用:
?? - X-Pack安全模塊
?? - API密鑰認證
?? - 網絡訪問控制
七、學習資源推薦
- 官方文檔:Elasticsearch Reference
- 實戰工具:
- Kibana Dev Tools
- Postman
- curl命令
附錄:常用查詢速查表
查詢類型 | 用途 | 示例 |
---|---|---|
match | 全文搜索 | {“match”: {“title”: “ES”}} |
term | 精確值匹配 | {“term”: {“status”: 1}} |
range | 范圍查詢 | {“range”: {“age”: {“gte”: 18}}} |
bool | 組合多個查詢條件 | 見第四節示例 |
match_phrase | 短語搜索 | {“match_phrase”: {“quote”: “to be or”}} |
下集預告《Elasticsearch RESTful API入門:全文搜索實戰》