功能簡介
天翼云云搜索服務中的OpenSearch和Elasticsearch都支持異步搜索功能(Asynchronous Search),這一功能極大地提升了在處理長時間運行查詢時的用戶體驗和系統效率。通過異步搜索,用戶可以在后臺執行耗時較長的查詢任務,而無需等待查詢結果的即時返回。
這一功能對于大數據集、復雜查詢以及需要持續獲取查詢狀態的場景特別有用。
核心原理
在傳統的同步搜索模式中,用戶發出查詢請求后,必須等待查詢結果返回才能繼續其他操作。如果查詢涉及大規模數據處理或復雜的計算,這可能會導致用戶界面的阻塞和等待時間過長。異步搜索通過將查詢任務分離到后臺執行,解決了這一問題。
當用戶發起異步搜索請求時,搜索引擎會立即返回一個查詢任務 ID,而查詢本身在后臺繼續運行。用戶可以通過這個任務 ID 隨時查詢任務的進展情況、獲取部分結果或在任務完成后檢索最終的完整結果。這種模式下,用戶可以在查詢結果生成的過程中繼續執行其他操作,顯著提高了系統的響應性和用戶的工作效率。
應用場景與優勢
處理復雜查詢
對于涉及大量數據處理或復雜計算的查詢,異步搜索允許這些任務在后臺執行,避免了用戶界面因長時間等待而被凍結的情況。這尤其適用于分析海量數據、執行深度聚合或跨多索引的查詢任務。
提高系統性能與效率
異步搜索將長時間運行的任務移至后臺執行,減少了同步操作對系統資源的占用,優化了集群的整體性能。同時,用戶能夠并行處理其他任務,提升了操作效率。
斷點續查與容錯處理
異步搜索支持斷點續查,用戶可以在查詢任務中斷或超時時重新查詢任務狀態或繼續執行未完成的任務。這種容錯機制增強了查詢的可靠性,特別是在網絡波動或系統故障情況下。
查詢任務管理
用戶可以通過任務 ID 管理和監控查詢任務,包括取消正在運行的查詢、檢查任務進度、或者在任務完成后獲取結果。這種靈活的任務管理方式為用戶提供了更好的控制能力。
技術實現與應用
使用異步搜索功能非常簡單,用戶可以通過搜索引擎的 REST API 發起異步查詢請求。系統會返回一個任務 ID,用戶可以使用該 ID 查詢任務狀態、獲取中間結果或最終結果。搜索引擎還提供了管理接口,允許用戶查看當前的異步任務列表、取消任務或調整任務的超時時間。
在高并發或復雜查詢場景下,異步搜索減少了前端的等待時間,使得用戶可以在任務后臺執行時繼續其他工作,從而提高了工作流的效率和用戶體驗。
操作示例
我們以Elasticsearch為例。
創建索引:
PUT city-data
{
"settings": {
"number_of_replicas": 0
},
"mappings": {
"properties": {
"city": {
"type": "keyword"
}
}
}
}
插入數據:
POST city-data/_doc
{
"city": "Shanghai"
}
POST city-data/_doc
{
"city": "Beijing"
}
POST city-data/_doc
{
"city": "Guangzhou"
}
提交異步搜索請求:
POST _opendistro/_asynchronous_search/?pretty&size=10&wait_for_completion_timeout=1ms&keep_on_completion=true&request_cache=false
{
"aggs": {
"city": {
"terms": {
"field": "city",
"size": 10
}
}
}
}
這個命令會返回一個id:
"id" : "FnJRN1FZek04UTFldERyWThfZUtMaFEDOTMyFEhuZkZFbzRCbERJd09IVC0zTG9IATY="
獲取異步搜索結果:
GET _opendistro/_asynchronous_search/FnJRN1FZek04UTFldERyWThfZUtMaFEDOTMyFEhuZkZFbzRCbERJd09IVC0zTG9IATY=?pretty
返回:
{
"id" : "FnJRN1FZek04UTFldERyWThfZUtMaFEDOTMyFEhuZkZFbzRCbERJd09IVC0zTG9IATY=",
"state" : "STORE_RESIDENT",
"start_time_in_millis" : 1709711940616,
"expiration_time_in_millis" : 1709798340616,
"response" : {
"took" : 90,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "city-data",
"_type" : "_doc",
"_id" : "G3fFEo4BlDIwOHT-froB",
"_score" : 1.0,
"_source" : {
"city" : "Shanghai"
}
},
{
"_index" : "city-data",
"_type" : "_doc",
"_id" : "HHfFEo4BlDIwOHT-frrH",
"_score" : 1.0,
"_source" : {
"city" : "Beijing"
}
},
{
"_index" : "city-data",
"_type" : "_doc",
"_id" : "HXfFEo4BlDIwOHT-f7oM",
"_score" : 1.0,
"_source" : {
"city" : "Guangzhou"
}
}
]
},
"aggregations" : {
"city" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "Beijing",
"doc_count" : 1
},
{
"key" : "Guangzhou",
"doc_count" : 1
},
{
"key" : "Shanghai",
"doc_count" : 1
}
]
}
}
}
}
搜索引擎的異步搜索功能為處理復雜和長時間運行的查詢提供了極大的靈活性和效率。通過將查詢任務移至后臺執行,異步搜索不僅提升了系統的性能,還改善了用戶的操作體驗。
無論是在處理大數據集、優化系統資源利用,還是在實現查詢任務的靈活管理方面,異步搜索都為用戶提供了一個強大而高效的解決方案。