【Elasticsearch】分页查询

在 Elasticsearch 中,分页技术是处理大量搜索结果时的关键功能,尤其在需要优化性能或处理深度分页时。以下是三种主要的分页方法: from/size 、 scroll  API 和  search_after ,以及它们的详细对比和适用场景。
---

1.`from/size`分页
原理
`from/size`是最简单的分页方法,通过指定`from`和`size`参数来跳过指定数量的文档并返回指定数量的结果。
实现细节

• `from`:跳过的文档数量。

• `size`:每页返回的文档数量。
示例
请求:

```json
GET /index_name/_search
{
  "from": 0,
  "size": 10,
  "query": {
    "match_all": {}
  }
}
```


响应:

```json
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 100,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "index_name",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "field1": "value1",
          "field2": "value2"
        }
      },
      // 其他文档...
    ]
  }
}
```

优点

• 简单易用,适合用户界面分页。

• 支持随机访问任意页。
缺点

• 性能随`from`值增大而下降。

• 默认限制为 10,000 条结果。
适用场景

• 结果数量较少的场景。

• 用户界面分页。
---

2.`scroll`API
原理
`scroll`API 通过创建一个快照(snapshot)来保持搜索上下文,允许遍历大量数据。
实现细节

1. 初始化搜索上下文:首次请求返回初始结果和`_scroll_id`。

2. 滚动请求:使用`_scroll_id`获取更多结果。

3. 清理上下文:完成滚动后需清理上下文。
示例
初始化请求:

```json
POST /index_name/_search?scroll=1m
{
  "size": 100,
  "query": {
    "match_all": {}
  }
}
```


响应:

```json
{
  "_scroll_id": "abc123...",
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1000,
      "relation": "eq"
    },
    "hits": [
      {
        "_index": "index_name",
        "_type": "_doc",
   

### 实现Spring Boot Elasticsearch分页查询 在Spring Boot应用程序中集成Elasticsearch并实现分页查询涉及多个方面。为了简化配置过程,Spring Boot会自动选择最近版本的Spring Data模块[^1]。 对于分页功能的支持,`Pageable`接口提供了必要的参数来定义分页行为。下面是一个简单的例子展示如何在一个控制器方法中利用`PagedResourcesAssembler`来进行分页处理: ```java import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.hateoas.PagedModel; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @RestController @RequestMapping("/elasticsearch") public class ElasticSearchController { private final ProductRepository productRepository; // 假设有一个Product实体类及其对应的仓库 @Autowired public ElasticSearchController(ProductRepository productRepository) { this.productRepository = productRepository; } /** * 获取带有分页的产品列表. */ @GetMapping("/products") public PagedModel<EntityModel<Product>> getProducts( @RequestParam(value="page", defaultValue="0") int page, @RequestParam(value="size", defaultValue="20") int size) { PageRequest pageable = PageRequest.of(page, size); Page<Product> productsPage = productRepository.findAll(pageable); var assembler = new EntityModelAssembler<>(product -> Link.of("/elasticsearch/products/" + product.getId())); return pagedResourcesAssembler.toModel(productsPage, assembler); } } ``` 上述代码片段展示了如何通过RESTful API端点接收分页请求,并返回经过HATEOAS增强后的资源集合。这里使用了`EntityModelAssembler`来自定义链接生成逻辑;而`pagedResourcesAssembler.toModel()`则负责将`Page<T>`转换成适合客户端消费的形式[^4]。 此外,在实际应用开发过程中可能还需要考虑其他因素,比如性能优化、错误处理机制以及安全性等方面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值