在 Elasticsearch 中,multi_search
(也稱為?msearch
)是一種允許你在單個請求中執行多個搜索操作的 API。它可以顯著減少網絡開銷,尤其是在需要執行多個查詢時。multi_search
?會將多個查詢打包成一個請求發送給 Elasticsearch,然后返回多個查詢的結果。
1.?multi_search
?的基本用法
multi_search
?的請求格式如下:
-
請求頭:指定索引名稱(可選)和搜索參數。
-
請求體:每個查詢由兩部分組成:
-
一個可選的?
header
?部分,用于指定索引、類型和搜索參數。 -
一個?
body
?部分,用于指定查詢 DSL。
-
示例
以下是一個?multi_search
?的示例,包含兩個查詢:
json
復制
POST /_msearch {} {"index": "index1"} {"query": {"match_all": {}}, "size": 10} {} {"index": "index2"} {"query": {"match": {"field": "value"}}, "size": 5}
-
第一個查詢:在?
index1
?中執行?match_all
?查詢,返回最多10條文檔。 -
第二個查詢:在?
index2
?中執行?match
?查詢,返回最多5條文檔。
2.?multi_search
?的響應
multi_search
?的響應是一個數組,數組中的每個元素對應一個查詢的結果。例如:
json
復制
{"responses": [{"took": 10,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": {"value": 100,"relation": "eq"},"max_score": 1.0,"hits": [{"_index": "index1","_type": "_doc","_id": "1","_score": 1.0,"_source": {"field": "value1"}},...]}},{"took": 5,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": {"value": 50,"relation": "eq"},"max_score": 1.5,"hits": [{"_index": "index2","_type": "_doc","_id": "2","_score": 1.5,"_source": {"field": "value2"}},...]}}] }
-
responses
:是一個數組,每個元素對應一個查詢的結果。 -
每個查詢的結果與普通的?
_search
?請求返回的結果格式相同。
3.?multi_search
?的優勢
-
減少網絡開銷:
-
將多個查詢打包成一個請求,減少了客戶端與 Elasticsearch 之間的網絡往返次數。
-
適合需要同時執行多個查詢的場景。
-
-
提高性能:
-
Elasticsearch 會并行處理?
multi_search
?中的查詢,從而提高查詢效率。
-
-
靈活性:
-
可以在一個請求中查詢多個索引,甚至可以為每個查詢指定不同的索引和參數。
-
4.?multi_search
?的使用場景
-
批量查詢:
-
當需要同時執行多個查詢時,可以使用?
multi_search
?來減少網絡開銷。 -
例如,在前端頁面中同時加載多個模塊的數據。
-
-
多索引查詢:
-
當需要從多個索引中查詢數據時,可以使用?
multi_search
?來簡化查詢邏輯。
-
-
性能優化:
-
當需要優化查詢性能時,可以將多個查詢合并為一個?
multi_search
?請求。
-
5. 示例代碼
以下是一個完整的?multi_search
?示例,包含兩個查詢:
請求
json
復制
POST /_msearch {} {"index": "index1"} {"query": {"match_all": {}}, "size": 10} {} {"index": "index2"} {"query": {"match": {"field": "value"}}, "size": 5}
響應
json
復制
{"responses": [{"took": 10,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": {"value": 100,"relation": "eq"},"max_score": 1.0,"hits": [{"_index": "index1","_type": "_doc","_id": "1","_score": 1.0,"_source": {"field": "value1"}},...]}},{"took": 5,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": {"value": 50,"relation": "eq"},"max_score": 1.5,"hits": [{"_index": "index2","_type": "_doc","_id": "2","_score": 1.5,"_source": {"field": "value2"}},...]}}] }
6. 總結
-
multi_search
?是一種高效的批量查詢機制,適合同時執行多個查詢。 -
優勢:減少網絡開銷、提高性能、支持多索引查詢。
-
使用場景:批量查詢、多索引查詢、性能優化。
通過合理使用?multi_search
,可以顯著提高查詢效率,尤其是在需要執行多個查詢的場景中。