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

相关推荐
铭毅天下2 小时前
Elasticsearch 到 Easysearch 数据迁移 5 种方案选型实战总结
大数据·elasticsearch·搜索引擎·全文检索
Elastic 中国社区官方博客6 小时前
Elasticsearch 推理 API 增加了开放的可定制服务
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
yumgpkpm9 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 数据库汇聚操作指南 CMP(类 Cloudera CDP 7.3)
大数据·hive·hadoop·elasticsearch·zookeeper·big data·cloudera
Elastic 中国社区官方博客9 小时前
AI Agent 评估:Elastic 如何测试代理框架
大数据·人工智能·elasticsearch·搜索引擎
Elasticsearch11 小时前
在 Elasticsearch 中解析 JSON 字段
elasticsearch
望获linux13 小时前
【实时Linux实战系列】使用 u-trace 或 a-trace 进行用户态应用剖析
java·linux·前端·网络·数据库·elasticsearch·操作系统
dessler13 小时前
Elasticsearch(ES)-Logstash
linux·运维·elasticsearch
云中隐龙14 小时前
mac使用本地jdk启动elasticsearch解决elasticsearch启动时jdk损坏问题
java·elasticsearch·macos
Elastic 中国社区官方博客18 小时前
根据用户行为数据中的判断列表在 Elasticsearch 中训练 LTR 模型
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
风清再凯21 小时前
04_es原理&filebeat使用
大数据·elasticsearch·搜索引擎