【Elasticsearch】Long-running searches 与 Elasticsearch 异步搜索

Long-running searches 与 Elasticsearch 异步搜索

1.什么是 Long-running searches?

Elasticsearch 通常能够快速处理大规模数据的搜索请求。然而,在某些情况下,搜索可能需要在多个分片上执行,或者涉及大量数据集甚至多个远程集群。这种情况下,搜索结果无法在短时间内返回(例如几毫秒内)。对于这种长时间运行的搜索(Long-running searches),同步等待结果返回是不理想的。

2.异步搜索的优势

为了应对长时间运行的搜索,Elasticsearch 提供了异步搜索功能。通过异步搜索,用户可以提交一个搜索请求,该请求将在后台异步执行。用户可以在稍后的时间点监控搜索进度,并按需检索最终结果或部分结果。

3.异步搜索的主要功能

• 提交异步搜索

异步搜索 API 接受与普通搜索 API 相同的参数和请求体,但执行方式为异步。提交后,API 会返回一个唯一的标识符(ID),用户可以使用该 ID 来监控进度、获取结果或删除搜索。

示例请求:

```http

POST /sales*/_async_search?size=0

{

"sort": [

{ "date": { "order": "asc" } }

],

"aggs": {

"sale_date": {

"date_histogram": {

"field": "date",

"calendar_interval": "1d"

}

}

}

}

```

响应示例:

```json

{

"id": "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",

"is_partial": true,

"is_running": true,

"start_time_in_millis": 1583945890986,

"expiration_time_in_millis": 1584377890986,

"response": {

"took": 1122,

"timed_out": false,

"num_reduce_phases": 0,

"_shards": {

"total": 562,

"successful": 3,

"skipped": 0,

"failed": 0

},

"hits": {

"total": {

"value": 157483,

"relation": "gte"

},

"max_score": null,

"hits": []

}

}

}

```

响应中的关键字段说明:

• `id`:异步搜索的唯一标识符,用于后续操作。

• `is_partial`:表示当前结果是否为部分结果。如果搜索仍在运行,此字段始终为`true`。

• `is_running`:表示搜索是否仍在执行。

• `successful`:表示已成功完成搜索的分片数量。

• 获取异步搜索结果

用户可以通过`GET`请求,使用之前返回的 ID 来检索异步搜索的结果。如果搜索仍在运行,可以设置`wait_for_completion_timeout`参数来等待搜索完成。

示例请求:

```http

GET /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=

```

响应示例:

```json

{

"id": "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",

"is_partial": false,

"is_running": false,

"start_time_in_millis": 1583945890986,

"expiration_time_in_millis": 1584377890986,

"response": {

"took": 12144,

"timed_out": false,

"num_reduce_phases": 46,

"_shards": {

"total": 562,

"successful": 188,

"skipped": 0,

"failed": 0

},

"hits": {

"total": {

"value": 456433,

"relation": "eq"

},

"max_score": null,

"hits": []

},

"aggregations": {

"sale_date": {

"buckets": []

}

}

}

}

```

• 获取异步搜索状态

如果用户仅需要监控异步搜索的状态,而不关心结果,可以使用状态 API。此 API 仅返回搜索的进度信息。

示例请求:

```http

GET /_async_search/status/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=

```

响应示例:

```json

{

"id": "FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=",

"is_running": true,

"is_partial": true,

"start_time_in_millis": 1583945890986,

"expiration_time_in_millis": 1584377890986,

"_shards": {

"total": 562,

"successful": 188,

"skipped": 0,

"failed": 0

}

}

```

• 取消或删除异步搜索

如果用户不再需要某个异步搜索,可以通过`DELETE`请求取消搜索或删除保存的结果。

示例请求:

```http

DELETE /_async_search/FmRldE8zREVEUzA2ZVpUeGs2ejJFUFEaMkZ5QTVrSTZSaVN3WlNFVmtlWHJsdzoxMDc=

```

4.安全与权限

如果启用了 Elasticsearch 的安全功能,异步搜索的访问和操作权限将受到限制:

• 只有提交搜索请求的用户或 API 密钥可以访问搜索结果或状态。

• 具有`monitor`权限的用户可以查看搜索状态。

• 具有`cancel_task`权限的用户可以删除异步搜索。

5.总结

Elasticsearch 的异步搜索功能为长时间运行的搜索提供了高效的解决方案。通过异步执行、进度监控和结果检索,用户可以更好地管理复杂的搜索任务,而不必等待同步执行完成。

相关推荐
77qqqiqi11 分钟前
安装es和kibana
elasticsearch·kibana
LQ深蹲不写BUG3 小时前
ElasticSearch 基础内容深度解析
大数据·elasticsearch·搜索引擎
2501_920047033 小时前
git在Linux中的使用
linux·git·elasticsearch
和科比合砍81分1 天前
ES模块(ESM)、CommonJS(CJS)和UMD三种格式
大数据·elasticsearch·搜索引擎
AAA修煤气灶刘哥2 天前
MySQL 查文本查哭了?来唠唠 ES 这货:从 “啥是 ES” 到 Java 撸代码,一篇整明白!
java·后端·elasticsearch
Elasticsearch2 天前
什么是上下文工程 (Context Engineering)?
elasticsearch
白毛大侠2 天前
如何安全地删除与重建 Elasticsearch 的 .watches 索引
大数据·elasticsearch·jenkins
Elastic 中国社区官方博客2 天前
Elasticsearch 的 JVM 基础知识:指标、内存和监控
java·大数据·elasticsearch·搜索引擎·全文检索
Arthurmoo2 天前
Git常用命令大全:高效开发必备
大数据·elasticsearch·搜索引擎
华农第一蒟蒻2 天前
Elasticsearch赋能3D打印机任务统计分析
java·大数据·spring boot·后端·elasticsearch·adb·maven