elasticsearch 分页,java分页排序
00-1010 ES ES:1的特性介绍。从大小浅分页2。滚动深度分页滚动删除3。深度分页后搜索
目录
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个基于RESTful web界面的分布式多用户全文搜索引擎。Elasticsearch用Java语言开发,在Apache许可下开源发布,是一个流行的企业搜索引擎。Elasticsearch用在云计算中,可以实现实时搜索,稳定可靠,速度快,安装使用方便。00-1010分布式实时文件存储,每个字段都可以索引,以便可以检索。
可以作为大型分布式集群(数百台服务器)技术,处理PB级数据。
Elasticsearch并不是一项新技术。它主要结合全文检索、数据分析和分布式技术,形成一个独特的专家系统。
下面介绍Java中通过Elasticsearch实现分页的三种方法。还有谁不行?一端有带圈可握的短马鞭
00-1010“浅”分页可以理解为简单分页。
它的原理很简单,就是查询前20条数据,然后截断前10条,只返回10-20条数据。事实上,这浪费了前10个查询。
GET test _ dev/_ search { query : { bool : { filter :[{ term : { age : 28 } } }, size: 10, from: 20,Sort 3360[{ timestamp 3360 { order 3360 desc }, _ id 3360默认情况下,From为0,size为10,即默认情况下,所有查询只返回前10条数据。
这里有必要了解一下from/size的原理:
因为es是基于碎片的,所以假设有5个碎片,from=100,size=10。根据排序规则,将从五个切片中的每一个中检索100条数据,然后在聚合成500条数据后选择最后10条数据。
经过测试,分页越晚,执行效率越低。总体来说,随着from的增加,消耗时间也会增加。而且数据量越大越明显!
ES 简介
从大小查询在10000-50000条数据(1000-5000页)以内是可以的,但是如果数据太多就会出现深度分页的问题。为了解决上述问题,elasticsearch提出了一种滚动方法。
滚动类似于sql中的光标。使用scroll,一次只能获取一页内容,然后会返回一个scroll_id。根据返回的scroll_id可以连续获取下一页的内容,所以scroll不适合有页面跳转的情况。
获取test_dev/_search?scroll=5m { query : { bool : { filter :[{ term : { age : 28 } } }, size: 10, from: 0,Sort 3360[{ timestamp 3360 { order 3360 desc }, _ id 3360 {order 要使用滚动,必须将从设置为0。Size决定了每次调用_search返回的数字。然后我们可以通过数据返回的_scroll_id来读取下一页。每个请求将读取接下来的10条数据,直到数据被读取或scroll_id保留时间到期:
GET _ search/scroll { scroll _ id : dnf 1 zxj 5 vghlbkzldg
NoBQAAAAAAAJZ9Fnk1d......", "scroll": "5m"}注意:请求的接口不再使用索引名了,而是_search/scroll
,其中GET和POST方法都可以使用。
scroll删除
根据官方文档的说法,scroll的搜索上下文会在scroll的保留时间截止后自动清除,但是我们知道scroll是非常消耗资源的,所以一个建议就是当不需要了scroll数据的时候,尽可能快的把scroll_id
显式删除掉。 清除指定的scroll_id
:
DELETE _search/scroll/DnF1ZXJ5VGhlbkZldGNo.....清除所有的scroll:
DELETE _search/scroll/_all
三、search_after 深分页
scroll 的方式,官方的建议不用于实时的请求(一般用于数据导出),因为每一个scroll_id
不仅会占用大量的资源,而且会生成历史快照,对于数据的变更不会反映到快照上。 search_after
分页的方式是根据上一页的最后一条数据来确定下一页的位置,同时在分页请求的过程中,如果有索引数据的增删改查,这些变更也会实时的反映到游标上。但是需要注意,因为每一页的数据依赖于上一页最后一条数据,所以无法跳页请求。
为了找到每一页最后一条数据,每个文档必须有一个全局唯一值,官方推荐使用_uid
作为全局唯一值,其实使用业务层的 id 也可以。
GET test_dev/_search{ "query": { "bool": { "filter": [ { "term": { "age": 28 } } ] } }, "size": 20, "from": 0, "sort": [ { "timestamp": { "order": "desc" }, "_id": { "order": "desc" } } ]}使用
search_after
必须要设置from=0
。这里我使用timestamp和_id
作为唯一值排序。我们在返回的最后一条数据里拿到sort属性的值传入到search_after
。使用sort返回的值搜索下一页:
GET test_dev/_search{ "query": { "bool": { "filter": [ { "term": { "age": 28 } } ] } }, "size": 10, "from": 0, "search_after": [ 1541495312521, "d0xH6GYBBtbwbQSP0j1A" ], "sort": [ { "timestamp": { "order": "desc" }, "_id": { "order": "desc" } } ]}到此这篇关于Elasticsearch 实现分页的 3 种方式,还有谁不会??的文章就介绍到这了,更多相关Elasticsearch 实现分页内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。