【Elasticsearch查询】深度查询

文章目录

  • 深度查询
    • from/to
    • Scroll
      • 如何查询
      • 重要笔记
      • 保持搜索上下文环境存活
      • 手动清除
      • 切片
    • Search After
      • 排序
      • 查询
      • 注意
      • Demo

深度查询

from/to

运行Search进行查询时,可以使用from和size参数对结果进行分页。

  • from参数定义了要获取的第一个结果的偏移量。
  • size参数表示允许返回的最大命中次数,即返回的条数。

1、作为请求参数

GET /_search?from=0&size=10
{"query" : {"term" : { "user" : "kimchy" }}
}

2、在请求体中设置

GET /_search
{"from" : 0, "size" : 10,"query" : {"term" : { "user" : "kimchy" }}
}

from默认值为0,size为10。

注意from + size不能大于index.max_result_window索引设置,默认值为10,000。

Scroll

虽然搜索请求一般返回单个“页面”的结果,但滚动查询可以用于从单个搜索请求检索大量结果(甚至所有结果),其方式与在传统数据库上使用游标非常相似。

滚动查询不是为了满足实时的用户请求,而是为了处理大量的数据,例如,为了将一个索引的内容重新索引到一个具有不同配置的新索引中。

滚动请求返回的结果反映了发出初始搜索请求时索引的状态,比如实时快照。对文档的后续更改(索引、更新或删除)只会影响以后的搜索请求。

如何查询

为了使用滚动查询,初始搜索请求应该在查询字符串中指定滚动参数,它告诉Elasticsearch它应该保持“搜索上下文”环境活跃多久(参见保持搜索上下文活跃),例如?scroll=1m。

POST /twitter/_search?scroll=1m
{"size": 100,"query": {"match" : {"title" : "elasticsearch"}}
}

上述请求的结果包括一个_scroll_id,它应该被传递给滚动查询,以便检索下一批结果。

POST /_search/scroll  //可以使用GET或POST, URL不应该包含索引名——这是在原始搜索请求中指定的。
{"scroll" : "1m",  //滚动参数告诉Elasticsearch将搜索上下文再打开1m。"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" 
}

size参数允许您配置每批结果返回的最大命中次数。每次调用滚动API返回下一批结果,直到没有更多的结果留下返回,即hits数组是空的。

重要笔记

  1. 初始搜索请求和随后的每个滚动请求都返回一个_scroll_id。虽然_scroll_id可以在请求之间更改,但它并不应该总是更改——在任何情况下,只应该使用最近接收到的_scroll_id

  2. 如果请求指定aggregations,则只有初始搜索响应中包含aggregations结果。

  3. 当排序顺序为_doc时,滚动请求的优化可以使它们更快。如果您想遍历所有文档而不考虑顺序,这是最有效的选项:

    GET /_search?scroll=1m
    {"sort": ["_doc"]
    }
    

保持搜索上下文环境存活

滚动参数(传递给搜索请求和每个滚动请求)告诉Elasticsearch它应该保持搜索上下文存活多长时间。它的值(例如1m)不需要足够长来处理所有数据——它只需要足够长的时间来处理前一批结果。

每个滚动请求(带滚动参数)设置一个新的到期时间。如果滚动请求没有传递滚动参数,那么搜索上下文将作为滚动请求的一部分被释放。

通常,后台合并过程通过合并较小的段来优化索引,以创建新的较大的段,同时删除较小的段。这个过程在滚动期间继续进行,但是一个开放的搜索上下文环境可以防止旧的段在仍在使用时被删除。这就是为什么Elasticsearch能够返回初始搜索请求的结果,而不考虑随后对文档的更改的原因。

保持较旧的段处于活动状态意味着需要更多的文件句柄。确保已将节点配置为具有足够的空闲文件句柄。

查看节点有多少的搜索上下文环境是开放的:

GET /_nodes/stats/indices/search?human响应:
"scroll_total" : 75,
"scroll_time" : "1.6h",
"scroll_time_in_millis" : 5868591,
"scroll_current" : 0,    //当前的滚动查询

手动清除

当滚动超时时,搜索上下文将自动删除。然而,保持滚动打开是有代价的,正如前面所讨论的,一旦滚动不再被使用,使用clear-scroll API应该明确地清除滚动:

DELETE /_search/scroll
{"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

多个滚动id可以作为数组传递:

DELETE /_search/scroll
{"scroll_id" : ["DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==","DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrU"]
}

可以使用_all参数清除所有搜索上下文:

DELETE /_search/scroll/_all

scroll_id还可以作为查询字符串参数或在请求主体中传递。多个滚动id可以作为逗号分隔值传递:

DELETE /_search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==,DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAA

切片

对于返回大量文档的滚动查询,可以将该滚动分割成多个切片,并且每个切片可以独立消费:

GET /twitter/_search?scroll=1m
{"slice": {"id": 0, "max": 2 },"query": {"match" : {"title" : "elasticsearch"}}
}GET /twitter/_search?scroll=1m
{"slice": {"id": 1,"max": 2},"query": {"match" : {"title" : "elasticsearch"}}
}

第一个请求的结果返回了属于第一个分片(id:0)的文档,第二个请求的结果返回了属于第二个分片的文档。 由于切片的最大数量设置为2,所以两个请求的结果的并集等效于不切片的滚动查询的结果。

默认情况下,拆分首先在分片上进行,然后使用uid字段在每个分片上进行本地拆分,其公式如下:slice(doc) = floorMod(hashCode(doc._uid), max)。例如,如果分片数为2而用户请求4个切片,则将切片0和2分配给第一个分片,并将切片1和3分配给第二个分片。

每个滚动都是独立的,可以像任何滚动查询一样并行处理。

如果切片的数量大于分片的数量,切片过滤器在第一次调用时非常慢,它的复杂度为O(N),内存消耗等于每切片N位,其中N是切片中的文档总数。在几个调用之后,应该缓存过滤器,随后的调用应该更快,但是您应该限制并行执行的切片查询的数量,以避免内存爆炸。

为了完全避免这种开销,可以使用另一个字段的doc_values来做切片,但用户必须确保该字段具有以下属性:

  • 字段是数字的。
  • doc_values在该字段上启用
  • 每个文档都应该包含一个值。如果文档中指定的字段有多个值,则使用第一个值。
  • 每个文档的值应该在创建文档且不更新时设置一次。这确保了每个片都得到确定性的结果。
  • 该字段的基数应该很高。这确保了每个切片获得大致相同数量的文档。
GET /twitter/_search?scroll=1m
{"slice": {"field": "date","id": 0,"max": 10},"query": {"match" : {"title" : "elasticsearch"}}
}

对于仅追加基于时间的索引,可以安全地使用时间戳字段。

默认情况下,每次滚动允许的最大切片数限制为1024。您可以更新index.max_slices_per_scroll索引设置绕过此限制。

Search After

可以通过使用from和size来对结果进行分页,但是当达到深度分页时,成本就变得过高了。 index.max_result_window默认值为10,000是一个保障,搜索请求占用堆内存和时间与from +size成比例。

建议使用scroll查询进行有效的深度滚动,但是滚动上下文开销很大,不建议将其用于实时用户请求。search_after参数提供了一个活动游标,从而绕过了这个问题。其思想是使用来自前一页的结果来帮助检索下一页。

排序

  1. 应将每个文档中的具有唯一值的字段作为排序依据, 否则,具有相同排序值的文档的排序顺序将不确定,并可能导致结果丢失或重复。
  2. id字段在每个文档中都有唯一的值,但是不建议直接将其用作排序。
  3. 请注意search_after会寻找第一个完全或部分与排序字段提供的值相匹配的文档。 因此,如果文档的排序字段值是“ 654323”,而在search_after中搜索“ 654”,则该文档仍将匹配并返回在此文档之后找到的结果。
  4. 在此字段上禁用doc_values(默认启用),则对其进行排序时需要在内存中加载大量数据。 建议在另一个启用了doc_values的字段中(客户端侧或使用摄取节点的提取器)复制id字段的内容,并使用此新字段作为排序的最终字段。

查询

GET twitter/_search
{"size": 10,"query": {"match" : {"title" : "elasticsearch"}},"sort": [{"date": "asc"},{"tie_breaker_id": "asc"}      ]
}启用doc_values的_id字段副本

上述请求的结果包括每个文档的排序值数组。这些排序值与search_after参数一起使用,并返回“after”之后的结果集。例如,我们可以使用上一个文档的排序值,并将其传递给search_after来检索下一页的结果:

GET twitter/_search
{"size": 10,"query": {"match" : {"title" : "elasticsearch"}},"search_after": [1463538857, "654323"],"sort": [{"date": "asc"},{"tie_breaker_id": "asc"}]
}

注意

使用search_after时,from的参数必须设置为0(或-1)。

search_after不是一个自由跳转到随机页面的解决方案,而是并行的滚动许多查询。它与滚动查询非常相似,但与之不同的是,search_after参数是无状态的,它总是根据最新版本的searcher进行解析。因此,在遍历过程中,排序顺序可能会根据索引的更新和删除而改变。

Demo

POST /test_after/_doc/_bulk
{"index":{"_id":1}}
{"title":"ElasticSearch","collectTime":1}
{"index":{"_id":2}}
{"title":"logstach","collectTime":2}
{"index":{"_id":3}}
{"title":"Kibana","collectTime":3}
{"index":{"_id":4}}
{"title":"Beats","collectTime":4}GET test_after/_search
{"size": 2,"query": {"match_all": {}},"sort": [{"collectTime": "asc"}]
}GET test_after/_search
{"size": 2,"query": {"match_all": {}},"search_after": [2],"sort": [{"collectTime": "asc"}]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我用 Navicat 的这些技能少加了好多班,也为公司挣了不少w

今天又用 Navicat 解决了一个数据同步的需求,财务又到账一笔收入....... 本文我将结合我过去的实践,给大家推荐一款数据库的运维工具。给大家呈现一下竟然可以用 Navicat 解决这些实际问题 。 熬了几个夜,毫无保留地将这些技能分享&#xf…

使用R语言进行判别分析

一、样本数据描述 2016年全国31个省、直辖市、自治区城镇居民人均消费支出水平划为2类,其中北京和上海划为一类,其余地区划为一类,将广东和西藏作为待判样本,具体划分数据如下表,试对数据进行判别分析,并将…

vue中动态引入图片

分析 很多时间,不管是vue2,还是vue3开发中都会遇到,动态渲染图片的功能,但是为什么我们直接将图片的路径直接赋值给变量的时候,图片渲染不出来,而通过require引入加载图片后却能正常渲染呢?主要…

解释什么是内连接、左连接和右连接,并给出每种连接的SQL示例

在关系型数据库中,连接(JOIN)是一种在查询中组合来自两个或多个表的行的方法。这些表通过一个或多个列中的相关值关联起来。SQL 提供了几种类型的连接,每种连接在处理表之间的关系和数据检索时都有其特定的方式。最常见的连接类型…

华为HarmnyOS TypeScript基础语法快速入门

华为HarmnyOS TypeScript基础语法快速入门 一、JavaScript、TypeScript、ArkTS二、TypeScript基础语法1. 基础类型2. 条件语句3. 函数4. 类5. 模块6. 迭代器 一、JavaScript、TypeScript、ArkTS ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS&am…

Flask+Gunicorn中文乱码解决方案

在使用FlaskGunicorn部署应用时,发现中文的输出存在乱码的现象。这是因为Python的默认编码是ASCII,而ASCII并不支持中文字符。 解决Python中文乱码问题的首要任务是确保使用合适的编码方式。当你处理中文字符时,应该使用UTF-8编码。UTF-8是一…

Axios入门

1.概念 Axios是一个开源的可以用在浏览器和node.js的异步通信框架,他的主要功能是实现Ajax异步通信 2.Axios入门程序 2.1.准备json格式的文件 {"name": "小明","address": {"street": "雁塔","city"…

动画原理:表面形变算法的思考与总结

前言: 之前我的文章 Mesh形变算法_mesh算法-CSDN博客就有大致的讨论过,介绍的也比较粗略!现在主要是想在Triangulated Surface Mesh Deformation方向上更深入的讨论一下!结合今年我对这一块的学习谈谈我的理解~ 下面要介绍大致几…

Java设计模式——桥连模式

桥接模式简单来说就是通过将抽象部分和具体部分分离,使它们可以独立地变化。如果你的一个类存在多个变化维度(如抽象和具体的实现)。若使用继承来处理这些变化,将会导致类层次结构的急剧增加,难以管理和维护。并且&…

MySQL(基础篇)——函数、约束

一.函数 1.定义 函数是指一段可以直接被另一段程序调用的程序或代码。 2.字符串函数 常见如下: -- 字符串拼接 SELECT CONCAT(hello,MySql) AS CONCAT -- 将字符串全部转为小写 SELECT LOWER(HEllo MYSql) AS LOWER -- 将字符串全部转为大写 SELECT UPPER(Hello…

环境配置 |Jupyter lab/Jupyter Notebook 安装与设置

ipynb使用Jupyterlab/Jupyter Notebook 来编写Python程序时的文件,在使用时,可以现转换为标准的.py的python文件 1.Jupyter Lab 1.1.下载安装 环境:Linux pip install jupyterlab 1.2.使用 jupyter lab 点击后进入 1.3.jupyter lab更换内核 因为我的是在anac…

178文章复现:基于matlab的微震图像去噪

文章复现:基于matlab的微震图像去噪,利用同步压缩连续小波变换进行自动微震去噪和起始检测,SS-CWT 可对时间和频率变化的噪声进行自适应过滤,可以去除小幅值信号中的大部分噪声,检测地震事件并估算地震发生时间。程序已…

数据结构之树结构(上)

存储方式 数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效…

C++实现计算复杂数学表达式

本文使用C实现Shunting-yard算法,将中缀表达式转换为后缀表达式,然后使用后缀表达式计算结果,实现了目前支持以下 四则运算(、-、*、/)开平方(^)取基数为 10 的对数(L)小…

小(2)型土石坝安全监测设施配置详解

小(2)型土石坝的安全监测是确保大坝稳定、安全运行的重要环节。为此,合理配置安全监测设施显得尤为重要。以下是对小(2)型土石坝安全监测设施配置的详细介绍。 一、渗流量监测 渗流量是反映大坝安全状况的关键指标之一。为准确监测渗流量,我们采用仪器量…

【大数据】Flink SQL 语法篇(十):EXPLAIN、USE、LOAD、SET、SQL Hints

《Flink SQL 语法篇》系列,共包含以下 10 篇文章: Flink SQL 语法篇(一):CREATEFlink SQL 语法篇(二):WITH、SELECT & WHERE、SELECT DISTINCTFlink SQL 语法篇(三&…

day05_用户管理minIO角色分配(页面制作,查询用户,添加用户,修改用户,删除用户,用户头像,查询所有角色,保存角色数据)

文章目录 1 用户管理1.1 页面制作1.2 查询用户1.2.1 需求说明1.2.2 后端接口需求分析SysUserSysUserDtoSysUserControllerSysUserServiceSysUserMapperSysUserMapper.xml 1.2.3 前端对接实现思路sysUser.jssysRole.vue 1.3 添加用户1.3.1 需求说明1.3.2 页面制作1.3.3 后端接口…

ChatGPT-4 AI 绘图魔力释放

最近刚开通了 ChatGPT4,正好要设计一个网站图标,想测试一下它AI绘图的能力,让它根据文字描述生成一个想象中的图标 (PS:如果想体验 GPT4 文生图,可以看这个教程 如何升级 ChatGPT 4.0) 第1次交…

【三维重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM

题目:SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM 地址:spla-tam.github.io 机构:CMU(卡内基梅隆大学)、MIT(美国麻省理工) 总结:SplaTAM,一个新…

ywtool network命令

一.network功能介绍 network功能就是通过脚本的方式配置IP信息,分为4项: (1) 配置单网卡(2)配置br网桥(单网卡)(3)配置bond(两张网卡)(4)配置ovs网桥(单网卡) 日志文件:/var/log/ywtools/ywtools-network.log/usr/local/ywtools/config/config.ini中network参数:…