Elasticsearch 異步搜索 Async search 實戰(zhàn)
1、Elasticsearch 異步搜索定義
異步搜索 API 可異步執(zhí)行搜索請求、監(jiān)控其進度并檢索可用的部分結(jié)果。
如下的官方介紹動畫,能更加生動的介紹清楚異步檢索。
傳統(tǒng)檢索 VS 異步檢索,在數(shù)據(jù)量比較大時:
傳統(tǒng)檢索可能導(dǎo)致超時,以至于無數(shù)據(jù)返回;或者需要等待很久,用戶體驗差。 異步檢索,可以快速響應(yīng)數(shù)據(jù),用戶無需等待。
2、Elasticsearch 異步搜索發(fā)布的版本
Elasitcsearch V7.7.0版本。
3、Elasticsearch 異步搜索適用場景
異步搜索允許用戶在異步搜索結(jié)果可用時檢索它們,從而消除了僅在查詢完全完成后才最終響應(yīng)的情況。
4、Elasticsearch 異步搜索實戰(zhàn)
4.1 執(zhí)行異步檢索
否則普通索引會直接返回結(jié)果數(shù)據(jù)。
拿個普通索引試驗一下:
POST?kibana_sample_data_flights/_async_search?size=0
{
??"sort":?[
????{
??????"timestamp":?{
????????"order":?"asc"
??????}
????}
??],
??"aggs":?{
????"sale_date":?{
??????"date_histogram":?{
????????"field":?"timestamp",
????????"calendar_interval":?"1d"
??????}
????}
??}
}
返回結(jié)果:
{
??"is_partial"?:?false,
??"is_running"?:?false,
??"start_time_in_millis"?:?1628663114252,
??"expiration_time_in_millis"?:?1629095114252,
??"response"?:?{
????"took"?:?23,
????"timed_out"?:?false,
????"_shards"?:?{
??????"total"?:?1,
??????"successful"?:?1,
??????"skipped"?:?0,
??????"failed"?:?0
????},
????"hits"?:?{
??????"total"?:?{
????????"value"?:?10000,
????????"relation"?:?"gte"
??????},
??????"max_score"?:?null,
??????"hits"?:?[?]
????},
為了達(dá)到異步檢索的目的,可以用推薦的測試寫入數(shù)據(jù)的工具:
https://github.com/oliver006/elasticsearch-test-data
你是不是也困惑,沒有測試數(shù)據(jù)或者沒有一定數(shù)量的測試數(shù)據(jù)?小工具來了。
產(chǎn)生100W+數(shù)據(jù),一條指令:
python?es_test_data.py?--es_url=http://172.21.0.14:19205?--count=1000000
結(jié)果如下:
Done?-?total?docs?uploaded:?1000000,?took?71?seconds
可以結(jié)合自己業(yè)務(wù)場景優(yōu)化一下,python 代碼編寫,很適合封裝成自己的小工具。

有了數(shù)據(jù),異步檢索直接開搞!
POST?test_data/_async_search?size=0
{
??"sort":?[
????{
??????"last_updated":?{
????????"order":?"asc"
??????}
????}
??],
??"aggs":?{
????"sale_date":?{
??????"date_histogram":?{
????????"field":?"last_updated",
????????"calendar_interval":?"1d"
??????}
????}
??}
}
返回結(jié)果如下:
{
??"id"?:?"FjUxQURkZFZyUVVlUUNydjVSZXhmWGcedFJCVnRVSVhSdVM0emN2YXZfTU9ZQToyNzE3MTcy",
??"is_partial"?:?true,
??"is_running"?:?true,
??"start_time_in_millis"?:?1628662256012,
??"expiration_time_in_millis"?:?1629094256012,
??"response"?:?{
????"took"?:?1008,
????"timed_out"?:?false,
????"terminated_early"?:?false,
????"num_reduce_phases"?:?0,
????"_shards"?:?{
??????"total"?:?1,
??????"successful"?:?0,
??????"skipped"?:?0,
??????"failed"?:?0
????},
????"hits"?:?{
??????"total"?:?{
????????"value"?:?0,
????????"relation"?:?"gte"
??????},
??????"max_score"?:?null,
??????"hits"?:?[?]
????}
??}
}
如果看不到上述結(jié)果,說明數(shù)據(jù)量還不夠大??梢栽賹?dǎo)入一些。
核心返回參數(shù)解釋一下:
id——可用于監(jiān)控其進度、檢索其結(jié)果和/或刪除它的異步搜索的標(biāo)識符。 is_partial——當(dāng)查詢不再運行時,指示在所有分片上搜索是失敗還是成功完成。在執(zhí)行查詢時,is_partial 始終設(shè)置為 true。 is_running——搜索是否仍在執(zhí)行中或已完成。 total——總體而言,將在多少個分片上執(zhí)行搜索。 successful——有多少分片已成功完成搜索。
4.2 查看異步檢索
GET?/_async_search/FjFoeU8xMHJKUW9pd1dzN1g2Rm9wOGcedFJCVnRVSVhSdVM0emN2YXZfTU9ZQToyNjYyNjk5

4.3 查看異步檢索狀態(tài)
GET?/_async_search/status/FjUxQURkZFZyUVVlUUNydjVSZXhmWGcedFJCVnRVSVhSdVM0emN2YXZfTU9ZQToyNzE3MTcy/

4.4 刪除/中止異步檢索
DELETE?/_async_search/FjFoeU8xMHJKUW9pd1dzN1g2Rm9wOGcedFJCVnRVSVhSdVM0emN2YXZfTU9ZQToyNjYyNjk5

5、官方文檔地址
https://www.elastic.co/guide/en/elasticsearch/reference/current/async-search.html
6、小結(jié)
異步搜索認(rèn)證考試環(huán)節(jié),大家了解就可以,能找到官方文檔位置,知道有哪幾個API。
實戰(zhàn)業(yè)務(wù)環(huán)節(jié)結(jié)合業(yè)務(wù)需求去選型使用即可。但,更傾向于數(shù)據(jù)量極大的業(yè)務(wù)傳統(tǒng)同步請求體驗差的場景。
你實戰(zhàn)業(yè)務(wù)場景有沒有使用異步檢索?歡迎留言討論。
推薦
更短時間更快習(xí)得更多干貨!
已帶領(lǐng)71位球友通過 Elastic 官方認(rèn)證!
中國僅通過百余人

