ES分页返回查询结果的执行过程
时间: 2024-01-03 11:05:22 浏览: 133
当执行一个分页查询时,Elasticsearch 的执行过程通常涉及以下步骤:
1. 查询解析:首先,Elasticsearch 解析查询请求,包括解析查询语句、过滤条件、排序规则以及分页参数等。它会根据查询的内容构建一个查询对象。
2. 查询路由:根据查询的索引和路由信息,Elasticsearch 确定哪些分片(shard)需要参与查询操作。如果指定了特定的路由值,它会将查询路由到对应的分片上。
3. 分片搜索:Elasticsearch 在每个相关的分片上执行搜索操作。它将查询对象发送给每个分片,并在分片上执行相应的查询操作。
4. 结果合并:每个分片独立地返回与查询匹配的文档列表和相关的打分信息。这些结果会经过协调节点(coordinating node)进行合并和排序,以生成全局的搜索结果列表。
5. 分页处理:在合并和排序后,Elasticsearch 根据指定的分页参数(页码、每页大小)截取所需的结果片段。它会跳过前面的文档,只返回当前页所需的文档数量。
6. 结果返回:最后,Elasticsearch 将分页后的结果返回给客户端,以满足查询请求。客户端可以根据返回的结果进行处理,如展示、分析或进一步处理。
需要注意的是,Elasticsearch 的分页是基于深度分页(deep pagination)的,这意味着在高页码的情况下,性能可能会受到影响。为了避免深度分页带来的性能问题,可以使用游标(scroll)或搜索后的滚动(search after)等技术来处理大量数据的分页查询。这些技术可以通过保持搜索上下文来提高性能,并减少重复的开销。
相关问题
elasticsearch 不分页查询
Elasticsearch提供了一种不分页查询的方法,可以使用scroll和scan来关闭打分或排序,以最高效的方式返回结果。通过将search_type设置为scan,并使用scroll参数指定滚动时间来执行不分页查询。例如,可以使用以下查询来执行不分页查询:
GET UserInfo/_search?scroll=5m&search_type=scan
{
"query": {
"bool": {
"filter": \[
{
"term": {
"home": "乌拉特前旗"
}
}
\]
}
},
"size": 10,
"from": 0,
"sort": \[
{
"age": {
"order": "desc"
},
"_id": {
"order": "desc"
}
}
\]
}
这个查询将返回满足条件的前10个结果,并按照年龄和ID进行降序排序。通过使用scroll参数指定滚动时间,可以在一定时间内获取更多的结果。这种方式可以提高查询效率,特别是在不需要按顺序返回结果时。\[3\]
#### 引用[.reference_title]
- *1* *2* [干货 | 全方位深度解读 Elasticsearch 分页查询](https://blog.csdn.net/wojiushiwo987/article/details/116472697)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *3* [【ElasticSearch从入门到放弃系列 十】Elasticsearch深度分页查询方式讨论](https://blog.csdn.net/sinat_33087001/article/details/109141960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
es分页查询scroll
scroll是一种在ES中执行分页查询的方法,它使用游标来迭代查询结果,而不是像传统的基于页码的分页查询那样,每次查询都会重新计算结果。
使用scroll方法进行分页查询的一般步骤如下:
1. 执行一次初始查询,包括查询条件、排序方式、需要返回的字段等信息。
2. 在查询结果中获取一个scroll_id,该id用于后续的游标查询。
3. 使用scroll_id执行下一次查询,指定需要返回的文档数量和scroll_id,直到查询结果为空。
以下是一个使用scroll进行分页查询的示例:
```
POST /my_index/_search?scroll=1m
{
"size": 10,
"query": {
"match": {
"title": "foo"
}
}
}
// 初始查询结果
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAADwFgFvMnNzYU5mYUgzQXV6QTl4Q2N4Z0EAAAAPABbhbzJzc2FOZmFIM0F1ekE5eENjeGdBAADAAVpuG8tzc2FOZmFIM0F1ekE5eENjeGdBAADAAVp0G8t",
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 100,
"relation": "eq"
},
"max_score": 0.2876821,
"hits": [
{
"_index": "my_index",
"_type": "_doc",
"_id": "1",
"_score": 0.2876821,
"_source": {
"title": "foo",
"body": "bar"
}
},
...
]
}
}
// 使用scroll_id执行下一次查询
POST /_search/scroll
{
"scroll": "1m",
"scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAADwFgFvMnNzYU5mYUgzQXV6QTl4Q2N4Z0EAAAAPABbhbzJzc2FOZmFIM0F1ekE5eENjeGdBAADAAVpuG8tzc2FOZmFIM0F1ekE5eENjeGdBAADAAVp0G8t"
}
// 下一次查询结果
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAADwFgFvMnNzYU5mYUgzQXV6QTl4Q2N4Z0EAAAAPABbhbzJzc2FOZmFIM0F1ekE5eENjeGdBAADAAVpuG8tzc2FOZmFIM0F1ekE5eENjeGdBAADAAVp0G8t",
"took": 1,
"timed_out": false,
"hits": {
"total": {
"value": 100,
"relation": "eq"
},
"max_score": 0.2876821,
"hits": [
{
"_index": "my_index",
"_type": "_doc",
"_id": "11",
"_score": 0.2876821,
"_source": {
"title": "foo",
"body": "bar"
}
},
...
]
}
}
```
需要注意的是,scroll_id在每次查询时都会返回,因此在执行后续查询时需要将上一次查询结果中的scroll_id传递给下一次查询。另外,scroll参数用于指定scroll_id的有效时间,如果一个scroll_id在该时间内没有被使用,则会被ES自动清除。
阅读全文