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

相关推荐
Elasticsearch6 小时前
Elasticsearch:使用机器学习生成筛选器和分类标签
elasticsearch
浮尘笔记10 小时前
go-zero使用elasticsearch踩坑记:时间存储和展示问题
大数据·elasticsearch·golang·go
unhurried人生——冕临12 小时前
Ubuntu安装Elasticsearch
elasticsearch
这个懒人21 小时前
深入解析Translog机制:Elasticsearch的数据守护者
数据库·elasticsearch·nosql·translog
愿你天黑有灯下雨有伞1 天前
Docker 安装 Elasticsearch 教程
运维·elasticsearch·docker
遇到困难睡大觉哈哈1 天前
Git推送错误解决方案:`rejected -> master (fetch first)`
大数据·git·elasticsearch
Roam-G1 天前
Elasticsearch 证书问题解决
大数据·elasticsearch·jenkins
qr9j422331 天前
elasticsearch 如果按照日期进行筛选
大数据·elasticsearch·jenkins
DavidSoCool1 天前
es分页边界数据重复问题处理
大数据·elasticsearch·搜索引擎
qq_5470261791 天前
Elasticsearch 正排索引
大数据·elasticsearch·jenkins