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分组结果进行分页。