elastic分页查询

const { Client } = require('@elastic/elasticsearch');

// 创建 Elasticsearch 客户端
const client = new Client({
  node: 'http://localhost:9200', // Elasticsearch 地址
});

// 使用 scroll 分页查询
async function scrollSearch(index, query, scrollTimeout = '1m', scrollSize = 10) {
  try {
    // 初始化 scroll 查询
    const response = await client.search({
      index, // 索引名称
      body: query, // 查询条件
      scroll: scrollTimeout, // scroll 超时时间
      size: scrollSize, // 每次返回的文档数量
    });

    const scrollId = response._scroll_id; // 获取 scroll ID
    let results = response.hits.hits; // 获取第一批结果

    // 如果结果不为空,继续滚动
    while (results.length > 0) {
      console.log(`Fetched ${results.length} documents.`);
      // 处理当前批次的文档
      results.forEach((doc) => {
        console.log(doc._source); // 输出文档内容
      });

      // 获取下一批结果
      const scrollResponse = await client.scroll({
        scroll_id: scrollId,
        scroll: scrollTimeout,
      });

      results = scrollResponse.hits.hits;
    }

    console.log('Scroll search completed.');
  } catch (error) {
    console.error('Error during scroll search:', error);
  }
}

// 示例查询
const index = 'my_index'; // 索引名称
const query = {
  query: {
    match_all: {}, // 查询所有文档
  },
};

// 调用 scroll 查询
scrollSearch(index, query);
const response = await client.search({
  index: 'my_index',
  body: {
    size: 0, // 不需要返回具体文档
    aggs: {
      my_buckets: {
        composite: {
          sources: [
            { group_by_field: { terms: { field: 'category.keyword' } } },
          ],
          size: 10, // 每页返回的桶数量
        },
      },
    },
  },
});

let afterKey = response.aggregations.my_buckets.after_key;
let buckets = response.aggregations.my_buckets.buckets;

while (buckets.length > 0) {
  console.log(`Fetched ${buckets.length} buckets.`);
  buckets.forEach((bucket) => console.log(bucket));

  const nextResponse = await client.search({
    index: 'my_index',
    body: {
      size: 0,
      aggs: {
        my_buckets: {
          composite: {
            sources: [
              { group_by_field: { terms: { field: 'category.keyword' } } },
            ],
            size: 10,
            after: afterKey, // 使用 after_key 分页
          },
        },
      },
    },
  });

  afterKey = nextResponse.aggregations.my_buckets.after_key;
  buckets = nextResponse.aggregations.my_buckets.buckets;
}

可以使用scroll对简单查询分页,

可以使用composite对aggs分组结果进行分页。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值