广州移动网站开发,青海个人旅游网站建设,有人情味的网站,广州网站优化平台提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 方式一#xff1a;from size实现原理使用方式优缺点 方式二#xff1a;scroll实现原理使用方式优缺点 方式三#xff1a;search_after实现原理使用方式优缺点 三… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 方式一from size实现原理使用方式优缺点 方式二scroll实现原理使用方式优缺点 方式三search_after实现原理使用方式优缺点 三种方式总结 方式一from size
from size是Elasticsearch中最直观的分页方式。其中from参数表示从第几条记录开始返回size参数表示返回的记录数。
实现原理 使用方式
在Elasticsearch中使用from和size进行分页查询的DSLDomain Specific Language
GET /your_index/_search
{query: {match_all: {} // 这里可以替换为任何你需要的查询条件},from: 0, // 从第几条记录开始索引从0开始size: 10, // 返回的记录条数sort: [{ field_name: {order: asc}} // 可选根据某个字段进行排序]
}
from参数指定了从哪一条记录开始返回size参数指定了要返回的记录条数。
假设一个名为products的索引搜索名称中包含apple的产品并且从第10条记录开始返回10条结果按价格升序排序
GET /products/_search
{query: {match: {name: apple}},from: 9, // 注意索引从0开始所以第10条记录的索引是9size: 10,sort: [{ price: {order: asc}}]
}
from设置为9以跳过前9条记录size设置为10以返回接下来的10条记录并且结果按照price字段的升序排列。
Elasticsearch会返回如下响应
{took: 5,timed_out: false,_shards: {total: 1,successful: 1,skipped: 0,failed: 0},hits: {total: {value: 100, // 假设总共有100条符合查询条件的产品relation: eq},max_score: 1.0,hits: [{_index: products,_type: _doc, // 注意在Elasticsearch 7.x及之后的版本中_type字段通常被设置为_doc_id: 10,_score: 1.0,_source: {name: Apple iPhone 12,price: 999.99,// ... 其他字段}},// ... 其他9条产品的结果{_index: products,_type: _doc,_id: 19,_score: 1.0,_source: {name: Apple Watch Series 6,price: 399.99,// ... 其他字段}}]}
}
优缺点 使用场景
适用于数据量不大、实时性要求高的场景。
方式二scroll
scroll是一种基于游标的分页方式它允许我们遍历大量数据而不需要在每次请求时重新计算整个搜索。
实现原理 使用方式
在Elasticsearch中scroll是一种用于检索大量数据可能是数百万条记录的分页机制它允许你保持一个搜索的“上下文”并继续检索结果而不需要为每一页都重新计算整个搜索。以下是使用scroll进行分页的DSL代码示例
DSL 代码示例
// 初始化scroll搜索
POST /_search/scroll
{size: 100, // 每次返回的文档数量scroll: 1m, // 保持scroll上下文的活动时间这里是1分钟query: {match_all: {} // 可替换为任何需要的查询条件}
}// 后续的scroll请求在第一次请求返回后
POST /_search/scroll
{scroll: 1m, // 保持与第一次请求相同的scroll上下文时间scroll_id: 你的scroll_id // 第一次请求返回的scroll_id
} 响应结果
第一次请求会返回如下结果
{_scroll_id: DnF1ZXJ5THV6QXRlbl84791547351,took: 1,timed_out: false,_shards: {total: 5,successful: 5,failed: 0},hits: {total: {value: 1000,relation: eq},max_score: 1.0,hits: [{_index: your_index,_type: _doc,_id: 1,_score: 1.0,_source: {// ... 文档的源数据 ...}},// ... 其他文档 ...]}
} 响应中可以看到_scroll_id字段这个值需要用于后续的scroll请求。
后续的scroll请求
使用上面响应中的_scroll_id进行后续的scroll请求
POST /_search/scroll
{scroll: 1m,scroll_id: DnF1ZXJ5THV6QXRlbl84791547351
}
这个请求会返回下一批文档直到所有的文档都被检索完或者scroll上下文过期。根据你的Elasticsearch集群的实际设置和性能需求来调整size和scroll参数的值。
优缺点 方式三search_after
search_after是一种基于排序值的分页方式它允许我们根据上一页的最后一条数据的排序值来获取下一页的数据。
实现原理 使用方式 GET /products/_search
{size: 10,query: {match_all: {} // 或者你可以添加具体的查询条件},sort: [{ price: {order: desc}},{ created_at: {order: asc}}]
} {_index: products,_type: _doc,_id: 最后一个产品的ID,_score: null,_sort: [129.99, // 最后一个产品的price值2023-10-23T12:00:00Z // 最后一个产品的created_at值],_source: {// ... 产品的详细信息 ...}
} GET /products/_search
{size: 10,query: {match_all: {} // 保持与初始查询相同的查询条件},sort: [{ price: {order: desc}},{ created_at: {order: asc}} // 保持与初始查询相同的排序字段和顺序],search_after: [129.99, // 上一页最后一个产品的price值2023-10-23T12:00:00Z // 上一页最后一个产品的created_at值]
} 优缺点 三种方式总结