1.深度分页

1.分页查询

POST /shop/_doc/_search { "query": { "match_all": {} },"from": 0, "size": 10
}

2.深度分页

深度分页其实就是搜索的深浅度,比如第1页,第2页,第10页,第20页,是比较浅的;第10000页,第20000页就是很深了。

使用如下操作:

{ "query": { "match_all": {} },"from": 9990, "size": 10
}{ "query": { "match_all": {} },"from": 9999, "size": 10
}

我们在获取第9999条到10009条数据的时候,其实每个分片都会拿到10009条数据,然后集合在一起,总共是10009*3=30027条数据,针对30027数据再次做排序

会获取最后10条数据。

如此一来,搜索得太深,就会造成性能问题,会耗费内存和占用cpu。而且es为了性能,他不支持超过一万条数据以上的分页查询。那么如何解决深度分页带来的

实我们应该避免深度分页操作(限制分页页数),比如最多只能提供100页的展示,从第101页开始就没了,毕竟用户也不会搜的那么深,我们平时搜索淘宝或者

也就看个10来页就顶多了。

譬如淘宝搜索限制分页最多100页,如下:

2.深度分页 - 提升搜索量

提升搜索量

“changing the [index.max_result_window] index level setting”

通过设置index.max_result_window来突破10000数据

GET /shop/_settings PUT /shop/_settings
{ "index.max_result_window": "20000"
}

3.scroll api 游标查询/滚动搜索

一次性查询1万+数据,往往会造成性能影响,因为数据量太多了。这个时候可以使用滚动搜索,也就是 scroll 。

滚动搜索可以先查询出一些数据,然后再紧接着依次往下查询。在第一次查询的时候会有一个滚动id,相当于一个 锚标记 ,随后再次滚动搜索会需要上一次搜索,根据这个进行下一次的搜索请求。每次搜索都是基于一个历史的数据快照,查询数据的期间,如果有数据变更,那么和搜索是没有关系的,搜索的内容还是上一次快照。

游标查询会取某个时间点的快照数据。 查询初始化之后索引上的任何变化会被它忽略。

  • scroll=1m,相当于是一个session会话时间,搜索保持的上下文时间为1分钟。
POST /shop/_search?scroll=1m { "query": { "match_all": { } },"sort" : ["_doc"], "size": 5
}//拷贝_scroll_id的值 ,每次请求都要更换_scroll_idPOST /_search/scroll
{"scroll": "1m", "scroll_id" : "your last scroll_id"
}

官文地址:https://www.elastic.co/guide/cn/elasticsearch/guide/current/scroll.html

这个查询的返回结果包括一个字段 _scroll_id, 它是一个base64编码的长字符串。

注意:注意游标查询每次返回一个新字段 _scroll_id。每次我们做下一次游标查询, 我们必须把前一次查询返回的字段 _scroll_id 传递进去。 当没有更多的结果返回的时候,我们就处理完所有匹配的文档了。

4.批量查询

之前的批量搜索查询:

Get http://123.57.129.206:9200/shop/_doc/_search{"query":{"ids":{"type":"_doc","values":["1001","1003","1004"]}}
}

现在的批量查询方式:

Get http://123.57.129.206:9200/shop/_doc/_mget{"ids":["1001","1002","10018"]
}

注意:查询的结果如果不存在,也会检索出来,不过这个显示的是"found": false

两种方式的查询各有不同,search查询的信息更多更全,但是_mget的使用更方便_

5.批量操作 bulk

基本语法

bulk操作和以往的普通请求格式有区别。不要格式化json,不然就不在同一行了,这个需要注意。

{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n ...
  • { action: { metadata }} 代表批量操作的类型,可以是新增、删除或修改

  • \n 是每行结尾必须填写的一个规范,每一行包括最后一行都要写,用于es的解析

  • { request body } 是请求body,增加和修改操作需要,删除操作则不需要

批量操作的类型

action 必须是以下选项之一:

  • create:如果文档不存在,那么就创建它。存在会报错。发生异常报错不会影响其他操作。

  • index:创建一个新文档或者替换一个现有的文档。

  • update:部分更新一个文档。

  • delete:删除一个文档。

metadata 中需要指定要操作的文档的 _index 、 _type 和 _id , _index 、 _type 也可以在url中指定

实操

  • create新增文档数据,在metadata中指定index以及type
POST /_bulk
//类型
{"create": {"_index": "shop2", "_type": "_doc", "_id": "2001"}}
//数据
{"id": "2001", "nickname": "name2001"} {"create": {"_index": "shop2", "_type": "_doc", "_id": "2002"}}
{"id": "2002", "nickname": "name2002"}
{"create": {"_index": "shop2", "_type": "_doc", "_id": "2003"}}
{"id": "2003", "nickname": "name2003"}
  • create创建已有id文档,在url中指定index和type
POST /shop/_doc/_bulk {"create": {"_id": "2003"}}
{"id": "2003", "nickname": "name2003"}
{"create": {"_id": "2004"}}
{"id": "2004", "nickname": "name2004"}
{"create": {"_id": "2005"}}
{"id": "2005", "nickname": "name2005"}
  • index创建,已有文档id会被覆盖,不存在的id则新增
POST /shop/_doc/_bulk {"index": {"_id": "2004"}}
{"id": "2004", "nickname": "index2004"}
{"index": {"_id": "2007"}}
{"id": "2007", "nickname": "name2007"}
{"index": {"_id": "2008"}}
{"id": "2008", "nickname": "name2008"}
  • update部分修改,对已有数据进行更改
POST /shop/_doc/_bulk{"update":{"_id":"2002"}}
{"doc":{"id": 2222}}
{"update":{"_id":"2003"}}
{"doc":{"nickname": "name2333"}}
  • delete删除操作,注意删除操作用的post请求
post /shop/_doc/_bulk{"delete":{"_id":"2002"}}{"delete":{"_id":"2003"}}

也可以一起使用:删除、新增和修改一起使用,举例如下:

POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "My first blog post" }
{ "index":  { "_index": "website", "_type": "blog" }}
{ "title":    "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }

注意:批量操作过程中,其中一个数据操作报错,并不会影响其他的数据操作。

详细可参考官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/bulk.html

多大是太大了?

​ 整个批量请求都需要由接收到请求的节点加载到内存中,因此该请求越大,其他请求所能获得的内存就越少。 批量请求的大小有一个最佳值,大于这个值,性能将不再提升,甚至会下降。 但是最佳值不是一个固定的值。它完全取决于硬件、文档的大小和复杂度、索引和搜索的负载的整体情况。

​ 幸运的是,很容易找到这个 最佳点 :通过批量索引典型文档,并不断增加批量大小进行尝试。 当性能开始下降,那么你的批量大小就太大了。一个好的办法是开始时将 1,000 到 5,000 个文档作为一个批次, 如果你的文档非常大,那么就减少批量的文档个数。

​ 密切关注你的批量请求的物理大小往往非常有用,一千个 1KB 的文档是完全不同于一千个 1MB 文档所占的物理大小。 一个好的批量大小在开始处理后所占用的物理大小约为 5-15 MB。

3.Elasticsearch学习之深度分页、游标查询、以及批量操作相关推荐

  1. ElasticSearch之处理深度分页

    ElasticSearch之处理深度分页 一.常规分页 二.scroll分页 三.search_after 在ES中实现分页的方法有三种,我们逐个分析一下他们的优缺点. 一.常规分页 在ES中,我们可 ...

  2. 如何在elasticsearch里面使用深度分页功能

    2019独角兽企业重金招聘Python工程师标准>>> 前面的文章提到过es默认的from+size的分页方式返回的结果数据集不能超过1万点,超过之后返回的数据越多性能就越低. 这是 ...

  3. Elasticsearch:Scroll深度分页及返回大量数据

    目录 方法一 设置size 方法二 from and size分页 方法三 scroll and scan滚屏. 在使用ES时,有时候不可避免的要返回大量的数据或者说返回满足你的查询条件的全部数据,而 ...

  4. elasticsearch java 分页查询_elasticsearch深度分页问题

    正版包邮elasticsearch实战与原理 70.1元 包邮 (需用券) 去购买 > elasticsearch分页对于用过es的人应该都会使用 ,和数据库的分页类似,如下所示,通过from ...

  5. ElasticSearch 分页查询及深度分页原理与实现

    查询流程 查询阶段 在初始化查询阶段(query phase),查询被向索引中的每个分片副本(原本或副本)广播.每个分片在本地执行搜索并且建 立了匹配 document 的优先队列(priority ...

  6. 京东面试题:ElasticSearch深度分页解决方案

    前言 Elasticsearch 是一个实时的分布式搜索与分析引擎,在使用过程中,有一些典型的使用场景,比如分页.遍历等. 在使用关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,同理,在 ...

  7. ElasticSearch 深度分页详解

    来源 | OSCHINA 社区 作者 | 京东云开发者-何守优 原文链接:https://my.oschina.net/u/4090830/blog/5593128 1 前言 ElasticSearc ...

  8. es scroll 时间_游标查询 Scroll | Elasticsearch: 权威指南 | Elastic

    游标查询 Scrolledit scroll 查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价. 游标查询允许我们 先做查询初始化,然后再批量地拉 ...

  9. es查询-统计总数以及深度分页

    一.查询总数 1.  ES 查询 hits 统计总数不准? 当我们使用 ES 的时候,有时会比较关心匹配到的文档总数是多少,所以在查询得到结果后会使用 hits.total.value 这个值作为匹配 ...

最新文章

  1. 神经网络基础及逻辑回归实现
  2. tensowflow 训练 远程提交_深度解析AutoML工具——NNI:带上超参一起训练
  3. markdown转html
  4. 如何把a1的图纸变成a0_「云顶之弈装备解析」面对回蓝——青龙刀与大天使究竟该如何取舍...
  5. *.bmp序列保存为*.raw文件[matlb实现]
  6. stand up meeting 12/8/2015
  7. Java编写代理服务器(Burp拦截Demo)一
  8. 记一次kafka集群频繁crash的排查过程
  9. python 列表操作详解,Python列表解析操作实例总结
  10. 【转载】漏洞 CNVD-2017-36682 相关公告以及 JavaScript / 安卓开发者须知
  11. 官方验证!雨林木风 Ghost XP SP3 装机版 ylmf_xp3_yn9.8 !!附:官方全部MD5!
  12. 希尔伯特变换到底有什么用
  13. 天若OCR文字识别软件
  14. LeeCode 130 DFS
  15. 若w=1,x=2,y=3,z=4,则条件表达式wx?w : zy?z : x的结果为 4
  16. 桃花、杏花、梨花、李花傻傻分不清?快来学习吧
  17. torch.nn.CosineSimilarity() 三维张量
  18. 一学期c语言的学习总结
  19. C++读取csv文件
  20. 故事版冲突The document me.storyboard could not be opened. Unrecognized file content.

热门文章

  1. 增长型CRM:CRM系统快速提升业绩,超额完成销售指标!
  2. VB.net或者C#编写按键精灵DLL教程
  3. 手机音质变差_3.5mm接口取消之后手机音质变差了?不,其实它能做到完美
  4. 天猫魔盒远程安装APP
  5. Linux中几个常用的重启命令 shutdown poweroff init reboot halt 的区别
  6. 买电脑主要看什么 买笔记本主要看什么
  7. 数字化基础建设水平和数字化市场环境相似,是长三角数字转型的优势
  8. spring中的前置处理器和后置处理器区别
  9. Solaris系统管理-fmd日志清理
  10. 九月英语总结——兴趣是最好的老师