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

【Elasticsearch系列八】高阶使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
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.lryc.cn/news/439727.html

相关文章:

  • 【H2O2|全栈】关于CSS(4)CSS基础(四)
  • node.js+Koa框架+MySQL实现注册登录
  • 矢量化操作
  • 【LeetCode】每日一题 2024_9_16 公交站间的距离(模拟)
  • 【Python笔记】PyCharm大模型项目环境配置
  • FPGA-Vivado-IP核-虚拟输入输出(VIO)
  • 使用knn算法对iris数据集进行分类
  • GEE Shapefile 格式转换 GeoJSON
  • 从kaggle竞赛零基础上手CV实战(Deepfake检测)
  • Linux cat命令详解使用:高效文本内容管理
  • YOLOv9改进系列,YOLOv9颈部网络SPPELAN替换为FocalModulation
  • 圆环加载效果
  • leetcode - 分治思想
  • Java面试题·解释题·单例模式、工厂模式、代理模式部分
  • 如何编写智能合约——基于长安链的Go语言的合约开发
  • 【PHP代码审计】PHP基础知识
  • 大模型笔记03--快速体验dify
  • Linux常用命令以及操作技巧
  • C语言 | Leetcode C语言题解之题409题最长回文串
  • FreeSql 全面指南:从基础到高级实战,深入解析读写分离与导航属性
  • 深度学习之微积分预备知识点
  • 动态内存
  • C/C++实现植物大战僵尸(PVZ)(打地鼠版)
  • C++ 科目二 智能指针 [weak_ptr] (解决shared_ptr的循环引用问题)
  • 解决RabbitMQ设置TTL过期后不进入死信队列
  • 【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel() 源码分析
  • EndnoteX9安装及使用教程
  • SQL:子查询
  • C语言刷题日记(附详解)(5)
  • 开源加密软件简介