当前位置: 首页 > news >正文

Elasticsearch:时间点 API

Elasticsearch:时间点 API-CSDN博客

在今天的文章中,我将着重介绍 Point in time API。在接下来的文章中,我将介绍如何运用 PIT 来对搜索结果进行分页。这也是被推荐使用的方法。

Point in time API
默认情况下,搜索请求针对目标索引的最新可见数据执行,这称为时间点。 Elasticsearch pit(时间点)是一个轻量级的视图,可以查看数据在启动时的状态。 在某些情况下,最好使用同一时间点执行多个搜索请求。 例如,如果在 search_after 请求之间发生刷新,则这些请求的结果可能不一致,因为搜索之间发生的更改仅在最近的时间点可见。

先决条件
如果启用了 Elasticsearch 安全特性,你必须具有目标数据流、索引或别名的读取索引权限。要在某个时间点 (PIT) 中搜索别名,你必须具有该别名的数据流或索引的读取索引权限。
下面,我们将以一些例子来展示如何使用 PIT 来进行搜索。我们首先来导入我们的索引:

POST _bulk
{ "index" : { "_index" : "twitter", "_id": 1} }
{"user":"双榆树-张三","message":"今儿天气不错啊,出去转转去","uid":2,"age":20,"city":"北京","province":"北京","country":"中国","address":"中国北京市海淀区","location":{"lat":"39.970718","lon":"116.325747"}}
{ "index" : { "_index" : "twitter", "_id": 2 }}
{"user":"东城区-老刘","message":"出发,下一站云南!","uid":3,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区台基厂三条3号","location":{"lat":"39.904313","lon":"116.412754"}}
{ "index" : { "_index" : "twitter", "_id": 3} }
{"user":"东城区-李四","message":"happy birthday!","uid":4,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区","location":{"lat":"39.893801","lon":"116.408986"}}
{ "index" : { "_index" : "twitter", "_id": 4} }
{"user":"朝阳区-老贾","message":"123,gogogo","uid":5,"age":35,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区建国门","location":{"lat":"39.718256","lon":"116.367910"}}
{ "index" : { "_index" : "twitter", "_id": 5} }
{"user":"朝阳区-老王","message":"Happy BirthDay My Friend!","uid":6,"age":50,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区国贸","location":{"lat":"39.918256","lon":"116.467910"}}
{ "index" : { "_index" : "twitter", "_id": 6} }
{"user":"虹桥-老吴","message":"好友来了都今天我生日,好友来了,什么 birthday happy 就成!","uid":7,"age":90,"city":"上海","province":"上海","country":"中国","address":"中国上海市闵行区","location":{"lat":"31.175927","lon":"121.383328"}}
我们使用上面的 bulk 命令导入6个数据。它将创建一个叫做 twitter 的索引。

在搜索请求中使用之前,必须明确打开时间点。 keep_alive 参数告诉 Elasticsearch 它应该保持一个时间点存活多久,例如 ?keep_alive=5m。

POST /twitter/_pit?keep_alive=2m
上面的命令将返回如下的结果:

{
  "id" : "g-azAwEHdHdpdHRlchZIck44aVdSNlFMNnEyTmVMUGJEVm9RABZxNnpoTVIxQVFIeTRkci1MSGlibU9BAAAAAAAAARtiFldSS2x2LVZJUU5xajU1ZkxCN2dyMUEAARZIck44aVdSNlFMNnEyTmVMUGJEVm9RAAA="
}
接下来,我们可以使用如下的命令来对我们的索引进行搜索:

GET _search
{
  "query": {
    "match": {
      "city": "北京"
    }
  },
  "pit": {
     "id" : "g-azAwEHdHdpdHRlchZIck44aVdSNlFMNnEyTmVMUGJEVm9RABZxNnpoTVIxQVFIeTRkci1MSGlibU9BAAAAAAAAARtiFldSS2x2LVZJUU5xajU1ZkxCN2dyMUEAARZIck44aVdSNlFMNnEyTmVMUGJEVm9RAAA=",
     "keep_alive": "2m"
  }
}
在使用上面的搜索时必须注意的一点是:我们不能使用如下的格式:

GET /twitter/_search
也就是说,我们不能使用索引名作为请求的一部分。我们必须注意一下的几个方面:

带有 pit 参数的搜索请求不得指定 index、routing 和 preference,因为这些参数是从时间点复制的。
id 参数告诉 Elasticsearch 从这个时间点使用上下文执行请求。
keep_alive 参数告诉 Elasticsearch 应该将时间点的生存时间延长多长时间。
在上面,我们设置 keep_alive 为2分钟。当我们在2分钟后再执行上面的搜索时,我们可以看到如下的错误信息:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "search_context_missing_exception",
        "reason" : "No search context found for id [72546]"
      }
    ],
    "type" : "search_phase_execution_exception",
    "reason" : "all shards failed",
    "phase" : "query",
    "grouped" : true,
    "failed_shards" : [
      {
        "shard" : 0,
        "index" : "twitter",
        "node" : "q6zhMR1AQHy4dr-LHibmOA",
        "reason" : {
          "type" : "search_context_missing_exception",
          "reason" : "No search context found for id [72546]"
        }
      }
    ]
  },
  "status" : 404
}
重要:开放时间点请求和后续的每个搜索请求可以返回不同的 id; 因此对于下一个搜索请求总是使用最近收到的 id。

我们接下来做另外一个实验。我们首先再次运行如下的命令:

POST /twitter/_pit?keep_alive=2m
运行完后,我们得到一个不一样的 id,尽管这个新的 id 和上次返回的值长的非常像。

我们使用最新的 id 来做如下的查询:

GET _search
{
  "query": {
    "match": {
      "city": "北京"
    }
  },
  "pit": {
     "id" : "g-azAwEHdHdpdHRlchZIck44aVdSNlFMNnEyTmVMUGJEVm9RABZxNnpoTVIxQVFIeTRkci1MSGlibU9BAAAAAAAAAR8tFldSS2x2LVZJUU5xajU1ZkxCN2dyMUEAARZIck44aVdSNlFMNnEyTmVMUGJEVm9RAAA=",
     "keep_alive": "2m"
  }
}
我们可以看到有5个这样的文档:

 我们接下来,使用如下的命令来添加一个新的文档:

PUT twitter/_doc/7
{
  "user": "张三",
  "message": "今天天气真好",
  "uid": 8,
  "age": 35,
  "city": "北京",
  "province": "北京",
  "country": "中国",
  "address": "中国北京市朝阳区",
  "location": {
    "lat": "31.175927",
    "lon": "121.383328"
  }
}

请注意这个文档的 city 字段也是 “北京”,那么在新增加一个文档后,再次来做如下的查询:

GET _search
{
  "query": {
    "match": {
      "city": "北京"
    }
  },
  "pit": {
     "id" : "g-azAwEHdHdpdHRlchZIck44aVdSNlFMNnEyTmVMUGJEVm9RABZxNnpoTVIxQVFIeTRkci1MSGlibU9BAAAAAAAAAR8tFldSS2x2LVZJUU5xajU1ZkxCN2dyMUEAARZIck44aVdSNlFMNnEyTmVMUGJEVm9RAAA=",
     "keep_alive": "2m"
  }
}
我们可以看到和之前一模一样的结果,还是5个文档。

然后,当我们做如下的查询:

GET /twitter/_search
{
  "query": {
    "match": {
      "city": "北京"
    }
  }
}
我们可以清楚地看到有6个文档的 city 是 “北京”

这到底是怎么回事呢?究其原因就是当我们查询时使用 pit 参数时,它只能查询在那个时间点之前的所有文档,而后面新增加的文档不能被查询到。这个在实际的很多应用中非常有用。比如针对一个快速变化的索引来说,我们想对它进行表格化,我们不希望在我们进行分页时每次得到的数据集是不同的。

保持时间点活着
传递给开放时间点请求和搜索请求的 keep_alive 参数延长了相应时间点的生存时间。 该值(例如 1m,参见时间单位)不需要足够长来处理所有数据 — 它只需要足够长以用于下一个请求。

通常,后台合并过程通过将较小的段合并在一起以创建新的更大的段来优化索引。 一旦不再需要较小的段,它们就会被删除。 但是,开放时间点会阻止删除旧段,因为它们仍在使用中。

提示:保持旧段(segment)处于活动状态意味着需要更多的磁盘空间和文件句柄。 确保你已将节点配置为具有充足的空闲文件句柄。 请参阅文件描述符。

此外,如果一个段(segment)包含已删除或更新的文档,那么该时间点必须跟踪该段中的每个文档在初始搜索请求时是否处于活动状态。 如果索引上有许多打开的时间点,并且会受到持续删除或更新的影响,请确保你的节点有足够的堆空间。

你可以使用节点统计 API 检查有多少时间点(即搜索上下文)打开:

GET /_nodes/stats/indices/search
关闭时间点 API
时间点在其 keep_alive 结束后自动关闭。 然而,保持时间点是有代价的,如上一节所述。 一旦不再用于搜索请求,就应关闭时间点。我们可以通过如下的命令来对它进行关闭:

DELETE /_pit
{
  "id" : "g-azAwEHdHdpdHRlchZIck44aVdSNlFMNnEyTmVMUGJEVm9RABZxNnpoTVIxQVFIeTRkci1MSGlibU9BAAAAAAAAASLCFldSS2x2LVZJUU5xajU1ZkxCN2dyMUEAARZIck44aVdSNlFMNnEyTmVMUGJEVm9RAAA="
}
如果该 id 还是 alive 的状态,那么它将返回:

{
  "succeeded" : true,
  "num_freed" : 1
}
在上面,如果返回 true,则与时间点 ID 关联的所有搜索上下文都将成功关闭。num_freed 表示多少个搜索上下文数量已成功关闭。

参考:

【1】https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html
————————————————
版权声明:本文为CSDN博主「Elastic 中国社区官方博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/UbuntuTouch/article/details/119926953

相关文章:

Elasticsearch:时间点 API

Elasticsearch:时间点 API-CSDN博客 在今天的文章中,我将着重介绍 Point in time API。在接下来的文章中,我将介绍如何运用 PIT 来对搜索结果进行分页。这也是被推荐使用的方法。 Point in time API 默认情况下,搜索请求针对目标…...

hive数据表定义

分隔符 CREATE TABLE emp( userid bigint, emp_name array<string>, emp_date map<string,date>, other_info struct<deptname:string, gender:string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMINAT…...

OpenMesh 网格简化之顶点聚类

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 顶点聚类方法将落在给定大小体素中的所有顶点集中到单个顶点之上,其过程有点类似于点云体素下采样,之后再基于聚类之后的顶点重新连接面片,以达到网格简化的目的。 二、实现代码 #define _USE_MATH_DEFINES #in…...

C++ 类和对象篇(八) const成员函数和取地址运算符重载

目录 一、const成员函数 1. const成员函数是什么&#xff1f; 2. 为什么有const成员函数&#xff1f; 3. 什么时候需要使用const修饰成员函数&#xff1f; 二、取地址运算符重载 1. 为什么需要重载取地址运算符&#xff1f; 2. 默认取地址运算符重载函数 3. 默认const取地址运…...

k8s 集群安装(vagrant + virtualbox + CentOS8)

主机环境&#xff1a;windows 11 k8s版本&#xff1a;v1.25 dashboard版本&#xff1a;v2.7.0 calico版本&#xff1a; v3.26.1 CentOS8版本&#xff1a;4.18.0-348.7.1.el8_5.x86_64 用到的脚本&#xff1a; https://gitcode.net/sundongsdu/k8s_cluster 1. Vagrant创建…...

8、Docker数据卷与数据卷容器

一、数据卷(Data Volumes) 为了很好的实现数据保存和数据共享&#xff0c;Docker提出了Volume这个概念&#xff0c;简单的说就是绕过默认的联合文件系统&#xff0c;而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。 数据卷 是一个可供一个或多个容器使用的特殊目…...

大数据与Hadoop入门理论

一、大数据的3种数据类型 1、结构化数据 可定义&#xff0c;有类型、格式、结构的强制约束 如&#xff1a;RDBMS&#xff08;关系型数据库管理系统&#xff09; 2、非结构化数据 没有规律没有数据约束可言&#xff0c;很复杂难以解析 如&#xff1a;文本文件&#xff0c;视…...

持续集成部署-k8s-深入了解 Pod:探针

持续集成部署-k8s-深入了解 Pod:探针 1. 探针分类2. 探针探测方式3. 探针参数配置4. 启动探针的应用5. Liveness 探针的应用6. Readiness 探针的应用1. 探针分类 Kubernetes 中的探针是指容器内的进程用于告知 Kubernetes 组件其自身状态的机制; Readiness Probe:就绪探针用…...

来单提醒/客户催单 ----苍穹外卖day9

来单提醒 需求分析 代码开发 注意:前端请求的并不是8080端口;而是先请求Nginx,Nginx进行反向代理以后转发到8080端口 这段代码首先创建了一个orders类用于更新订单状态 并且在更新状态后使用websocket发送给后端提醒 将信息放在map后,使用json的string化方式传给一个接收对象,…...

【单片机】18-红外线遥控

一、红外遥控背景知识 1.人机界面 &#xff08;1&#xff09;当面操作&#xff1a;按键&#xff0c;旋转/触摸按键&#xff0c;触摸屏 &#xff08;2&#xff09;遥控操作&#xff1a;红外遥控&#xff0c;433M/2.4G无线通信【穿墙能力强】&#xff0c;蓝牙-WIFI-Zigbee-LoRa等…...

【Node.js】module 模块化

认识 node.js Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff0c;可以用来编写服务器后端的应用程序。基于Chrome V8 引擎封装&#xff0c;但是没有 DOM 和 BOM。Node.js 没有图形化界面。node -v 检查是否安装成功。node index.js 执行该文…...

Vue中如何进行分布式日志收集与日志分析(如ELK Stack)

在Vue中实现分布式日志收集与日志分析&#xff08;使用ELK Stack&#xff09; 日志收集和分析在现代应用程序中是至关重要的&#xff0c;它们可以帮助开发人员监视和诊断应用程序的行为&#xff0c;从而提高应用程序的稳定性和性能。ELK Stack&#xff08;Elasticsearch、Logs…...

java学习--day23(线程池)

1.线程池Pool 线程池一个容纳了多个线程的容器&#xff0c;其中的线程可以反复的使用。省去了频繁创建线程的对象的操作&#xff0c;无需反复创建线程而消耗更多的资源 在 Java 语言中&#xff0c;并发编程都是通过创建线程池来实现的&#xff0c;而线程池的创建方式也有很多种…...

Unity Golang教程-Shader编写一个流动的云效果

创建目录 一个友好的项目&#xff0c;项目目录结构是很重要的。我们先导入一个登录界面模型资源。 我们先创建Art表示是美术类的资源&#xff0c;资源是模型创建Model文件夹&#xff0c;由于是在登录界面所以创建Login文件夹&#xff0c;下面依次是模型对应的资源&#xff0c…...

Python数据攻略-Pandas与地理空间数据分析

地理空间数据分析已经成为数据分析不可或缺的一部分。无论是在城市规划、交通分析,还是在环境科学中,地理空间数据都发挥着关键作用。 本文将为初学者和新手提供一个详细的指南,通过使用Python的Pandas库和Geopandas库,来进行地理空间数据分析。 文章目录 用Pandas处理地理…...

sourceTree无法启动

前几天win10系统自动更新后&#xff0c;sourceTree就无法打开了&#xff0c;双击只是图标闪一下&#xff0c;电脑重启后还是无法打开。找到了网上几种方法进行尝试&#xff1a; 方法一&#xff1a;修改配置信息 在自己的电脑路径下&#xff1a; C:\Users\你的用户名\AppData…...

【ARM Coresight 系列文章19 -- Performance Monitoring Unit(性能监测单元)

文章目录 1.1 PMU 介绍1.2 PMU 寄存器1.2.1 PMU 管理寄存器1.2.2 PMU 外设识别寄存器1.2.3 PMU 组件识别寄存器1.3 性能监控事件1.3.1 Cortex-A9 特定事件1.1 PMU 介绍 许多体系结构都包含 PMU(Performance Monitoring Unit)硬件,用于跟踪、计数系统内部的一些底层硬件事件…...

前端学习| 第二章

CSS学习|第一章 前言一、概述1. 语法规定2. 代码风格 二、选择器1. 基础选择器标签选择器类选择器id选择器通配符选择器 2. 复合选择器后代选择器子元素选择器并集选择器伪类选择器链接伪类选择器focus 伪类选择器 三、引入方式四、显示模式1. 块元素2. 行内元素3. 行内块元素4…...

Unity中Shader光强与环境色

文章目录 前言一、实现下图中的小球接受环境光照实现思路&#xff1a;1、在Pass中使用前向渲染模式2、使用系统变量 _LightColor0 获取场景中的主平行灯 二、返回环境中主环境光的rgb固定a(亮度)&#xff0c;小球亮度还随之改变的原因三、获取Unity中的环境光的颜色1、Color模式…...

Android9 查看连接多个蓝牙耳机查看使用中的蓝牙耳机

#Android9 查看连接多个蓝牙耳机查看使用中的蓝牙耳机 文章目录 一、主要api&#xff1a;二、BluetoothA2dp 对象的获取三、获取 BluetoothDevice 对象&#xff0c;四、其他&#xff1a; Android 9.0之后&#xff0c;支持一台手机可以同时连接多个蓝牙设备。 但是判断那个蓝牙…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...