ElasticSearch 学习 ==ELK== 进阶
二、ElasticSearch 学习 ELK 进阶
(1)文档局部更新
我们也说过文档是不可变的——它们不能被更改,只能被替换。 update API必须遵循相同的规则。表面看来,我们似乎是局部更新了文档的位置,内部却是像我们之前说的一样简单的使用 update API处理相同的检索*-修改-*重建索引流程,我们也减少了其他进程可能导致冲突的修改。
最简单的 update 请求表单接受一个局部文档参数 doc ,它会合并到现有文档中——对象合并在一起,存在的标量字段被覆盖,新字段被添加。举个例子,我们可以使用以下请求为博客添加一个 tags 字段和一个 views 字段:
POST /website/blog/1/_update
{"doc" : {"tags" : [ "testing" ],"views": 0}
}
返回:
{"_index" : "website","_id" : "1","_type" : "blog","_version" : 3
}
查询当前的文档信息:
GET /website/blog/1{"_index": "website","_type": "blog","_id": "1","_version": 3,"found": true,"_source": {"title": "My first blog entry","text": "Starting to get the hang of this...","tags": [ "testing" ], "views": 0}
}
(2)使用脚本局部更新
使用Groovy脚本这时候当API不能满足要求时,Elasticsearch允许你使用脚本实现自己的逻辑。脚本支持非常多的API,例如搜索、排序、聚合和文档更新。脚本可以通过请求的一部分、检索特殊的 .scripts 索引或者从磁盘加载方式执行。
默认的脚本语言是Groovy,一个快速且功能丰富的脚本语言,语法类似于Javascript。它
在一个沙盒(sandbox)中运行,以防止恶意用户毁坏Elasticsearch或攻击服务器。
1、硬编码更新:
脚本能够使用 update API改变 _source 字段的内容,它在脚本内部以 ctx._source 表示。例如,我们可以使用脚本增加博客的 views 数量:
POST /website/blog/1/_update
{"script" : "ctx._source.views+=1"
}
2、软编码更新:
我们还可以使用脚本增加一个新标签到 tags 数组中。在这个例子中,我们定义了一个新标签
做为参数而不是硬编码在脚本里。这允许Elasticsearch未来可以重复利用脚本,而不是在想
要增加新标签时必须每次编译新脚本:
#添加新的tag到文档中
POST /website/blog/1/_update
{"script": {"source": "ctx._source.tags.addAll(params.new_tag)","params": {"new_tag": ["search"]}}
}
查询结果:
GET /website/blog/1{"_index" : "website","_type" : "blog","_id" : "1","_version" : 10,"_seq_no" : 11,"_primary_term" : 1,"found" : true,"_source" : {"title" : "My first blog entry","text" : "Just trying this out...3","views" : 2,"tags" : ["testing","search"]}
}
3、更新可能不存在的文档
比如:
我们要在Elasticsearch中存储浏览量计数器。每当有用户访问页面,我们增加这个页面的浏览量。但如果这是个新页面,我们并不确定这个计数器存在与否。当我们试图更新一个不存在的文档,更新将失败。
在这种情况下,我们可以使用 upsert 参数定义文档来使其不存在时被创建,将自动创建该索引信息。
POST /website_new/pageviews/1/_update
{"script": {"source": "ctx._source.views+=1"},"upsert": {"views": 1}
}
查询自动创建的信息:
GET /website_new/pageviews/_search
{}//返回值
{"took" : 472,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "website_new","_type" : "pageviews","_id" : "1","_score" : 1.0,"_source" : {"views" : 3}}]}
}
4、更新和冲突
为了避免丢失数据, update API在检索**(retrieve)阶段检索文档的当前 _version ,然后在重建索引(reindex)阶段通过 index 请求提交。如果其他进程在检索(retrieve)和重建索引(reindex)**阶段修改了文档, _version 将不能被匹配,然后更新失败。
对于多用户的局部更新,文档被修改了并不要紧。例如,两个进程都要增加页面浏览量,增加的顺序我们并不关心——如果冲突发生,我们唯一要做的仅仅是重新尝试更新既可。
这些可以通过 retry_on_conflict 参数设置重试次数来自动完成,这样 update 操作将会在发生错误前进行重试,这个值默认为0。
POST /website/pageviews/1/_update?retry_on_conflict=5
{"script" : "ctx._source.views+=1","upsert": {"views": 0}
}
配置参数retry_on_conflict=5代表:在错误发生前重试更新5次。这种重试方式更适合于count这种与顺序无关的操作。
5、检索多个文档
使用ElasticSearch,检索多个文档可以使用合并多个请求来避免每个请求单独的网络开销。
如果你需要从Elasticsearch中检索多个文档,相对于一个一个的检索,更快的方式是在一个请求中使用multi-get或者 mget API。
mget:
- mget API参数是一个 docs 数组,数组的每个节点定义一个文档的 _index 、 _type 、 _id 元数据。但是如果你只想检索一个或者几个确定的字段,也可以使用 _source参数进行设置;
//比如已下操作则是查询两个index的信息整合在一起返回
POST /_mget
{"docs": [{"_index": "website","_type": "blog","_id": 2},{"_index": "website_new","_type": "pageviews","_id": 1,"_source": "views"}]
}
//返回结果是:
{"docs" : [{"_index" : "website","_type" : "blog","_id" : "2","_version" : 10,"_seq_no" : 5,"_primary_term" : 1,"found" : true,"_source" : {"title" : "My first external blog entry","text" : "This is a piece of cake..."}},{"_index" : "website_new","_type" : "pageviews","_id" : "1","_version" : 3,"_seq_no" : 2,"_primary_term" : 1,"found" : true,"_source" : {"views" : 3}}]
}
//也会通过docs组成数组的方式返回
如果想检索的在同一个_index中,可以直接使用ids的方式进行检索:
POST /website/blog/_mget
{"ids":["2","1"]
}//返回
{"docs" : [{"_index" : "website","_type" : "blog","_id" : "2","_version" : 10,"_seq_no" : 5,"_primary_term" : 1,"found" : true,"_source" : {"title" : "My first external blog entry","text" : "This is a piece of cake..."}},{"_index" : "website","_type" : "blog","_id" : "1","_version" : 11,"_seq_no" : 12,"_primary_term" : 1,"found" : true,"_source" : {"title" : "My first blog entry","text" : "Just trying this out...3","views" : 3,"tags" : ["testing","search"]}}]
}
我们还可以使用设置_type的方式进行检索:
POST /website_new/bolg/_mget
{"docs":[{"_id":2},{"_type":"pageviews","_id":1}]
}//返回
{"docs" : [{"_index" : "website_new","_type" : "bolg","_id" : "2","found" : false},{"_index" : "website_new","_type" : "pageviews","_id" : "1","_version" : 3,"_seq_no" : 2,"_primary_term" : 1,"found" : true,"_source" : {"views" : 3}}]
}
可以发现,在website_new index的bolg 类型下没有id为2的数据,所以返回值found为false,所以再使用_mget的时候需要检查found是否为false。
6、批量操作
就像 mget 允许我们一次性检索多个文档一样, bulk API允许我们使用单一请求来实现多个文档的 create 、 index 、 update 或 delete 。
也就是说,我们可以铜bulk API的方式使用一个请求完成create、index、update、delete一系列的操作。这对索引类似于日志活动这样的数据流非常有用,它们可以 以成百上千的数据为一个批次按序进行索引。
bulk 请求体如下:
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
...
这种格式类似于用 “\n” 符号连接起来的一行一行的JSON文档流**(stream)**。两个重要的点需注意:
- 每行必须以 “\n” 符号结尾,包括最后一行。这些都是作为每行有效的分离而做的标记。
- 每一行的数据不能包含未被转义的换行符,它们会干扰分析——这意味着JSON不能被美化打印。
将这些放在一起, bulk 请求表单是这样的:
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" :
{ "doc" : {"title" : "My updated blog post"} }
通过bulk api操作,Elasticsearch响应包含一个 items 数组,它罗列了每一个请求的结果,结果的顺序与我们请求的顺序相同:
{"took": 4,"errors": false,"items": [{"delete": {"_index": "website","_type": "blog","_id": "123","_version": 2,"status": 200,"found": true}},{"create": {"_index": "website","_type": "blog","_id": "123","_version": 3,"status": 201}},{"create": {"_index": "website","_type": "blog","_id": "EiwfApScQiiy7TIKFxRCTw","_version": 1,"status": 201}},{"update": {"_index": "website","_type": "blog","_id": "123","_version": 4,"status": 200}}]
}
但是在使用批量请求的时候,需要注意一点的是:
-
整个批量请求需要被加载到我们请求节点的内存里面,请求越大,那么给其他请求使用的内存空间就越小。
-
有一个最佳的 bulk 请求大小。超过这个大小,性能不再提升而且可能降低,这个最佳的大小与当前的硬件、网络环境、和搜索的复杂度有关。
-
通常可以试着使用线性增长的方式进行寻找这个平衡点,弱随着大小的增长,当性能开始降低,说明你每个批次的大小太大了。开始的数量可以在1000 ~ 5000个文档之间,如果你的文档非常大,可以使用较小的批次,通常着眼于你请求批次的物理大小是非常有用的。一千个1kB的文档和一千个1MB的文档大不相同。一个好的批次最好保持在5 ~15MB大小间。
相关文章:
ElasticSearch 学习 ==ELK== 进阶
二、ElasticSearch 学习 ELK 进阶 (1)文档局部更新 我们也说过文档是不可变的——它们不能被更改,只能被替换。 update API必须遵循相同的规则。表面看来,我们似乎是局部更新了文档的位置,内部却是像我们之前说的一样…...
【数据结构 -- C语言】 双向带头循环链表的实现
目录 1、双向带头循环链表的介绍 2、双向带头循环链表的接口 3、接口实现 3.1 开辟结点 3.2 创建返回链表的头结点 3.3 判断链表是否为空 3.4 打印 3.5 双向链表查找 3.6 双向链表在pos的前面进行插入 3.6.1 头插 3.6.2 尾插 3.6.3 更新头插、尾插写法 3.7 双向链…...
自然语言处理与其Mix-up数据增强方法报告
自然语言处理与其Mix-up数据增强方法 1绪论1.课题背景与意义1.2国内外研究现状 2 自然语言经典知识简介2.1 贝叶斯算法2.2 最大熵模型2.3神经网络模型 3 Data Augmentation for Neural Machine Translation with Mix-up3.1 数据增强3.2 对于神经机器翻译的软上下文的数据增强3.…...
Vue(组件化编程:非单文件组件、单文件组件)
一、组件化编程 1. 对比传统编写与组件化编程(下面两个解释图对比可以直观了解) 传统组件编写:不同的HTML引入不同的样式和行为文件 组件方式编写:组件单独,复用率高(前提组件拆分十分细致) 理…...
【MATLAB数据处理实用案例详解(22)】——基于BP神经网络的PID参数整定
目录 一、问题描述二、算法仿真2.1 BP_PID参数整定初始化2.2 优化PID2.3 绘制图像 三、运行结果四、完整程序 一、问题描述 基于BP神经网络的PID控制的系统结构如下图所示: 考虑仿真对象,输入为r(k)1.0,输入层为4,隐藏层为5&…...
第11章 项目人力资源管理
文章目录 项目人力资源管理 过程11.2.1 编制项目人力资源计划的工具与技术(1)层次结构图(工作、组织、资源 分解结构)(2)矩阵图(责任分配矩阵,RAM)(3…...
07-Vue技术栈之(组件之间的通信方式)
目录 1、组件的自定义事件1.1 绑定自定义事件:1.1.1 第一种方式1.1.2 第二种方式1.1.3 自定义事件只触发一次 1.2 解绑自定义事件1.3绑定原生DOM事件1.4 总结 2、全局事件总线(GlobalEventBus)2.1 应用全局事件总线 3、 消息订阅与发布&#…...
度量学习Metirc Learning和基于负例的对比学习Contrastive Learning的异同点思考
参考:对比学习(Contrastive Learning):研究进展精要 - 知乎 参考:对比学习论文综述【论文精读】_哔哩哔哩_bilibili 参考:度量学习DML之Contrastive Loss及其变种_对比损失的变种_胖胖大海的博客-CSDN博客 参考&…...
3.编写油猴脚本之-helloword
3.编写油猴脚本之-helloword Start 通过上一篇文章的学习,我们安装完毕了油猴插件。今天我们来编写一个helloword的脚步,体验一下油猴。 1. 开始 点击油猴插件>添加新脚本 默认生成的脚本 // UserScript // name New Userscript // name…...
openwrt的openclash提示【更新失败,请确认设备闪存空间足够后再试】
网上搜索了一下,问题应该是出在“无法从网络下载内核更新包”或者“无法识别内核的版本号” 解决办法:手动下载(我是只搞了DEV内核就搞定了TUN和Meta没有动) --> 上传到路由器上 --> 解压缩 --> 回到openclash界面更新配…...
torch.nn.Module
它是所有的神经网络的根父类! 你的神经网络必然要继承 可以看一下这篇文章...
论文解析-基于 Unity3D 游戏人工智能的研究与应用
1.重写 AgentAction 方法 1.1 重写 AgentAction 方法 这段代码是一个重写了 AgentAction 方法的方法。以下是对每行代码解释: ①public override void AgentAction(float[] vectorAction) 这行代码声明了一个公共的、重写了父类的 AgentAction 方法的方法。它接受…...
6、Flutterr聊天界面网络请求
一、准备网络数据 1.1 数据准备工作 来到网络数据制造的网址,注册登录后,新建仓库,名为WeChat_flutter;点击进入该仓库,删掉左侧的示例接口,新建接口. 3. 接着点击右上角‘编辑’按钮,新建响应内容,类型为Array,一次生成50条 4. 点击chat_list左侧添加按钮,新建chat_list中的…...
Java 8 腰斩!Java 17 暴涨 430%!!(文末福利)
New Relic 最新发布了一份 “2023 年 Java 生态系统状况报告”,旨在提供有关当今 Java 生态系统状态的背景和见解。该报告基于从数百万个提供性能数据的应用程序中收集的数据,对生产中使用最多的版本、最受欢迎的 JDK 供应商、容器的兴起等多方面进行了调…...
如何手写一个支持H.265的高清播放器
概述 音视频编解码技术在当前的互联网行业中十分热门,特别是高清视频播放器的开发,其中包括4K、8K等超高清分辨率的播放器,具有极高的市场需求和广泛的应用场景。H265编码技术更是实现高清视频压缩的重要手段之一。如果想要掌握音视频编解码…...
Day 1 认识软件测试——(软件测试定义、目的、原则)
Day 1 认识软件测试——(软件测试定义、目的、原则) 文章目录 Day 1 认识软件测试——(软件测试定义、目的、原则)软件测试的定义软件测试的目的软件测试的经济学问题黑盒测试白盒测试软件测试原则小结所谓软件测试,就是一个过程或一系列过程,用来确定计算机代码完成了其…...
Docker Harbor
目录 一、Docker Harbor概述 1、Harbor的优势 2、Harbor知识点 3、Docker私有仓库架构 二、Harbor构建Docker私有仓库 1、环境配置 2、案例需求 3、部署docker-compose服务 4、部署harbor服务 5、启动harbor ① 访问 ② 添加项目并填写项目名称 ③ 通过127.0.0.1来…...
第三十四章 Unity人形动画(上)
在我们DirectX课程中,我们讲过一个模型最少拥有网格和材质,可以没有动画。游戏场景中的静态物体就可以是这样的模型,例如花草树木,建筑物等等,他们通过MeshRenderer就可以渲染。对于一个带有动画的FBX文件,…...
计算机图形学-GAMES101-7
引言 场景中有很多的三角形,如果实现可见性和遮挡呢? 一个简单的想法是,从远到近画,近处的物体自然会覆盖掉远处的物体,这种画法也叫画家算法。 但是实际绘制中物体的顺序是不容易确定的,比如如下图绘制…...
AndroidAuto 解决PCTS NF7
直接上代码 public void handleNavigationFocusRequest(int focusType) {// Always grant requested focus in this example.-mGal.galReceiver.sendNavigationFocusState(focusType);+mGal.galReceiver.sendNavigationFocusState...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
