elasticsearch 分页,java分页排序

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: