【Elasticsearch系列八】高阶使用

news2024/9/21 23:24:20

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

      • 1.属性分析
      • 2.\_source 字段
      • 3.强制创建
      • 4.脚本使用
      • 5.查询索引
      • 6.\_version 字段
      • 7.重试次数
      • 8.批量查询 mget
      • 9.bulk
      • 10.定位错误语法
      • 11.Scroll 分批查询

1.属性分析

  • 版本号
  • 删除的时候做标记,使用的是懒删除
  • _id 分为手动 id 和默认 id
{
  "_index": "book",
  "_type": "_doc",
  "_id": "1",
  "_version": 6,
  "_seq_no": 7,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "id": 1,
    "title": "这是一文章",
    "content": "xxxxx",
    "comment": "备注信息",
    "mobile": "13344556677"
  }
}

2._source 字段

含义:插入数据时的所有字段和值。在 get 获取数据时,在 source 字段中原样返回。

GET /book/_doc/1

定制返回:

GET /book/_doc/1?_source_includes=id,title
{
  "_index": "book",
  "_type": "_doc",
  "_id": "1",
  "_version": 6,
  "_seq_no": 7,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "id": 1,
    "title": "这是一文章"
  }
}

3.强制创建

为防止覆盖原有数据,我们在新增时,设置为强制创建,不会覆盖原有文档。

PUT /index/_doc/1/_create
PUT /read_index/_doc/1/_create
{
    "id":1,
    "title":"这是一11文章",
    "content":"xxxxx",
    "comment":"备注信息",
    "mobile":"13344556677"
}
{
  "_index": "read_index",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

4.脚本使用

#插入数据
PUT /test_index/_doc/6
{
  "num": 0
}

#执行脚本
POST /test_index/_doc/6/_update
{
  "script": "ctx._source.num+=1"
}

#查询数据
GET /test_index/_doc/6
{
  "_index": "test_index",
  "_type": "_doc",
  "_id": "6",
  "_version": 2,
  "_seq_no": 1,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "num": 1
  }
}

5.查询索引

GET /test_index/_search
{
  "took": 339,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "test_index",
        "_type": "_doc",
        "_id": "6",
        "_score": 1.0,
        "_source": {
          "num": 1
        }
      }
    ]
  }
}

6._version 字段

删除的时候是异步删除,只是做了删除标记,延时删除策略.

es 内部主从同步时,是多线程异步,乐观锁机制。也是基于版本号

  • 线程 1 先到,线程 2 后到,副本数据是没有问题的
  • 线程 2 先到,线程 1 后到:
    • 副本分片先把数据改为 test3,verion=3.
    • 线程 1 请求到了,副本分片,判断请求的 verison=1 太旧了,就会丢弃这个请求。

说明:

  • version 使用数据自带的 version 版本号

  • _version&version_type=external 则是并发时使用程序自己指定的 version,且是不存在的

PUT /test_index/_doc/4?version=2&version_type=external
{
  "test_field": "itcast1"
}

7.重试次数

指定重试次数

POST /test_index/_doc/5/_update?retry_on_conflict=3
{
  "doc": {
    "test_field": "itcast1"
  }
}

结合 version

POST /test_index/_doc/5/_update?retry_on_conflict=3&version=22&version_type=external
{
  "doc": {
    "test_field": "itcast1"
  }
}

8.批量查询 mget

单条查询 GET /test_index/1,如果查询多个 id 的文档一条一条查询,网络开销太大。

GET /_mget
{
   "docs" : [
      {
         "_index" : "test_index",
         "_type" :  "_doc",
         "_id" :    1
      },
      {
         "_index" : "test_index",
         "_type" :  "_doc",
         "_id" :    7
      }
   ]
}
{
  "docs": [
    {
      "_index": "test_index",
      "_type": "_doc",
      "_id": "2",
      "_version": 6,
      "_seq_no": 12,
      "_primary_term": 1,
      "found": true,
      "_source": {
        "test_field": "test12333123321321"
      }
    },
    {
      "_index": "test_index",
      "_type": "_doc",
      "_id": "3",
      "_version": 6,
      "_seq_no": 18,
      "_primary_term": 1,
      "found": true,
      "_source": {
        "test_field": "test3213"
      }
    }
  ]
}

提示去掉 type

GET /_mget
{
   "docs" : [
      {
         "_index" : "test_index",
         "_id" :    2
      },
      {
         "_index" : "test_index",
         "_id" :    3
      }
   ]
}

同一索引下批量查询:

GET /test_index/_mget
{
   "docs" : [
      {
         "_id" :    2
      },
      {
         "_id" :    3
      }
   ]
}

第三种写法:搜索写法

post /test_index/_doc/_search
{
    "query": {
        "ids" : {
            "values" : ["1", "7"]
        }
    }
}

9.bulk

Bulk 操作解释将文档的增删改查一些列操作,通过一次请求全都做完。减少网络传输次数。

#语法
POST /_bulk
{"action": {"metadata"}}
{"data"}

示例:

#如下操作,删除5,新增14,修改2。
POST /_bulk
{ "create": { "_index": "test_index","_id": "8"}}
{ "test_field": "test8" }
{ "update": { "_index": "test_index","_id": "3"} }
{ "doc": {"test_field": "bulk test"} }
{ "delete": { "_index": "test_index","_id": "5" }}


总结:

  1. 功能:
    • delete:删除一个文档,只要 1 个 json 串就可以了
    • create:相当于强制创建 PUT /index/type/id/_create
    • index:普通的 put 操作,可以是创建文档,也可以是全量替换文档
    • update:执行的是局部更新 partial update 操作
  2. 格式:每个 json 不能换行。相邻 json 必须换行。
  3. 隔离:每个操作互不影响。操作失败的行会返回其失败信息。
  4. 实际用法:bulk 请求一次不要太大,否则一下积压到内存中,性能会下降。所以,一次请求几千个操作、大小在几 M 正好。

10.定位错误语法

验证错误语句:

GET /book/_validate/query?explain
{
  "query": {
    "mach": {
      "description": "java程序员"
    }
  }
}

返回:

{
  "valid": false,
  "error": "org.elasticsearch.common.ParsingException: no [query] registered for [mach]"
}

正确

GET /book/_validate/query?explain
{
  "query": {
    "match": {
      "description": "java程序员"
    }
  }
}

返回

{
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "valid": true,
  "explanations": [
    {
      "index": "book",
      "valid": true,
      "explanation": "description:java description:程序员"
    }
  ]
}

一般用在那种特别复杂庞大的搜索下,比如你一下子写了上百行的搜索,这个时候可以先用 validate api 去验证一下,搜索是否合法。

合法以后,explain 就像 mysql 的执行计划,可以看到搜索的目标等信息。

11.Scroll 分批查询

场景:下载某一个索引中 1 亿条数据,到文件或是数据库。

不能一下全查出来,系统内存溢出。所以使用 scoll 滚动搜索技术,一批一批查询。

scoll 搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于该旧的视图快照提供数据搜索,如果这个期间数据变更,是不会让用户看到的

每次发送 scroll 请求,我们还需要指定一个 scoll 参数,指定一个时间窗口,每次搜索请求只要在这个时间窗口内能完成就可以了。

搜索

GET /book/_search?scroll=1m
{
  "query": {
    "match_all": {}
  },
  "size": 3
}

返回

{
  "_scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAMOkWTURBNDUtcjZTVUdKMFp5cXloVElOQQ==",
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": []
  }
}

获得的结果会有一个 scoll_id,下一次再发送 scoll 请求的时候,必须带上这个 scoll_id

GET /_search/scroll
{
    "scroll": "1m",
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAMOkWTURBNDUtcjZTVUdKMFp5cXloVElOQQ=="
}

与分页区别:

  • 分页是给用户看的 deep paging

  • scroll 是用户系统内部操作,如下载批量数据,数据转移。零停机改变索引映射。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

在线教育平台项目

介绍 基于SpringBootVue前后端分离的在线教育平台项目,单体应用服务架构。系统共设计三种角色:管理员、讲师和学员,三个角色分别对应一个操作端。也就是本系统1个后台项目,三个前端项目。管理员端没有引入角色和权限管理&#xf…

YoloV8 trick讲解

1.将 YOLOv5 的 C3结构换成了梯度流更丰富的 C2f结构: C3 C3 模块的设计灵感来自 CSPNet,其核心思想是将特征图的部分通道进行分割和并行处理,目的是减少冗余梯度信息,同时保持较高的网络表达能力。C3 结构与传统的残差结构类似,但…

【23-24年】年度总结与迎新引荐

文章目录 相关连接前言1 忙碌的备研与本科毕设2 暑期阿里之旅3 团队荣誉与迎新引荐4 项目合作意向 相关连接 个人博客:issey的博客 - 愿无岁月可回首 前言 自从2023年4月更新了两篇关于NLP的文章后,我便消失了一年半的时间。如今,随着学业…

软考高级:存储系统IO 数据传输方式:程序控制方式、程序中断方式、DMA 方式、通道方式、IO 处理机 AI 解读

关于计算机中的IO数据传输方式,有几种不同的策略可以用来进行数据的传输和控制。我们分别讲解一下它们。 生活化例子 假设你在一条生产线上工作,有几种方式可以处理不同的任务(如搬运、检查、修理产品): 程序控制方…

Linux基础---09Find文件查找

百分之八十的财富掌握在百分之二十的手里,这就是著名的二八法则。这里列出关键字表,希望大家复习的时候看到关键字,脑袋里就自动浮现出整句命令。 查询方式主要参数文件名-name文件大小-size忽略大小写-iname按天-atime,-mtime,-…

目标检测基本知识

目标检测 一、目标检测二、常用的评价指标2.1 IOU2.2 NMS(非极大值抑制) 三、R-CNN网络基础3.1 Overfeat模型3.2 RCNN模型3.3FastRCNN模型 四、Faster-RCNN网络4.1 网络工作流程 五、yolo系列5.1 yoloV3 六、SSD算法 一、目标检测 目标检测的任务是找出图像中所有感兴趣的目标…

从index_put出发全面学习cuda和pytorch技术

一 前言 深感目前对于cuda和pytorch所涉及知识的广度和深度,但一时又不知道该如何去学习,经过多日的考虑,还是决定管中窥豹,从一个算子出发,抽丝剥茧,慢慢学习,把学习中碰到的问题都记录下来,希望可以坚持下去。 二 函数功能描述 【torch算子】torch.index_put和tor…

SOMEIP_ETS_112: SD_Empty_Option

测试目的: 验证DUT能够拒绝长度为0的IPv4选项的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个IPv4选项长度为0的SubscribeEventgroup消息时,能够正…

不同编程语言如何统计代码执行时间

在软件开发过程中,统计代码执行时间是一个非常有用的工具,可以帮助开发者优化程序性能、识别瓶颈以及进行基准测试。不同的编程语言提供了不同的方法来测量代码执行时间。以下是一些常见编程语言中测量代码执行时间的方法,并详细解释每一步的…

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清,I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写,而IIC是它的另一种表述方式,代表的是同一个意思,即“集成电路间总线”。I2C是一种由飞利浦公司(现恩智浦半…

数据结构(7.3_2)——平衡二叉树

平衡二叉树,简称平衡树(AVL树)----树上任一结点的左子树和右子树的高度之差不超过1. 结点的平衡因子左子树高-右子树高 //平衡二叉树结点 typedef struct AVLNode {int key;//数据域int blalance;//平衡因子struct AVLNode* lchild, * rchild; }AVLNode,*AVLTree; …

中秋:明月寄相思,灯笼映团圆

文章目录 前言项目概述实现步骤创建基础 HTML 结构添加动态背景和月亮创建 SVG 灯笼实现动态动画效果闪烁的星星效果调整灯笼和月亮尺寸 完整代码结语 前言 今天是中秋,这里先祝大家节日快乐!🎆🎆🎆 在这篇博客中&…

ChatGPT有三个快捷指令和三个模式,你知道吗?

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…

xtu oj 折纸

折纸# 题目描述# 一个长为a,宽为b矩形的纸,我们沿b边(左边)的中点与右上顶点的边折叠,求左上顶点在折叠以后离下边的距离? 输入# 第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例,为两个整数1≤a,b≤1000。…

​FullCalendar:强大的JavaScript事件日历

​FullCalendar:强大的JavaScript事件日历 如果你想让项目的日历功能像你周末一样灵活又强大,那么 FullCalendar 就是你的不二选择!本文将带你了解这款高效的 JavaScript 日历库的亮点与使用方式。 软件简介 FullCalendar 是一个用 JavaScri…

PMP--一模--解题--101-110

文章目录 11.风险管理--过程--识别风险→实施定性风险分析→实施定量风险分析→规划风险应对→实施风险应对→监督风险101、 [单选] 在项目即将进入收尾阶段时,项目经理发现了一项原来没有考虑到的新风险。该风险一旦发生,可能给最终的可交付成果带来重要…

CSS——网格布局(display: grid)之上篇

CSS——网格布局(display: grid) 前面介绍了弹性布局,今天我们介绍一下网格布局。 什么是网格布局 CSS网格布局(CSS Grid Layout)是一种用于创建复杂网页布局的系统,它允许开发者以二维系统(…

【C++学习】 IO 流揭秘:高效数据读写的最佳实践

✨ 今朝有酒今朝醉,明日愁来明日愁 🌏 📃个人主页:island1314 🔥个人专栏:C学习 ⛺️ 欢迎关注:👍点赞 👂&#x1f3f…

Docker部署ddns-go教程(包含完整的配置过程)

本章教程教程,主要介绍如何用Docker部署ddns-go。 一、拉取容器 docker pull jeessy/ddns-go:v6.7.0二、运行容器 docker run -d \--name ddns-go \--restart unless-stopped \

蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)

新建工程教程见http://t.csdnimg.cn/JySLg 点亮LED教程见http://t.csdnimg.cn/Urlj5 末尾含所有代码 目录 按键原理图 一、按键使用需要解决的问题 1.抖动 1.什么是抖动 2.抖动类型 3.如何去消除抖动 FIRST.延时函数消抖(缺点:浪费CPU资源&#xff…