谷粒商城实战笔记-105~107-全文检索-ElasticSearch-入门

文章目录

  • 一,105-全文检索-ElasticSearch-入门-_cat
  • 二,106-全文检索-ElasticSearch-入门-put&post新增数据
  • 三,107-全文检索-ElasticSearch-入门-get查询数据&乐观锁字段
      • 1,过时的乐观锁-version
      • 2,Elasticsearch7的乐观锁

这篇内容是使用kibana学习elasticsearch的使用。

一,105-全文检索-ElasticSearch-入门-_cat

在kibana中打开devtools界面。

在这里插入图片描述

在代码的下面界面的左侧区域使用elasticsearch的API完成对elasticsearch的操作。

在这里插入图片描述

在DevTools左侧编辑界面输入命令,点击右侧三角按钮发出请求。
在这里插入图片描述

GET /_cat/nodes:查看所有节点
GET /_cat/health:查看 es 健康状况
GET /_cat/master:查看主节点
GET /_cat/indices:查看所有索引 

在这里插入图片描述

  1. GET /_cat/nodes

    • 这个API端点用于列出Elasticsearch集群中的所有节点。它会返回节点的名称、角色、主机地址、版本等信息。
      在这里插入图片描述
  2. GET /_cat/health

    • 这个API端点用于显示集群的健康状况。它会返回集群的总体状态(如green、yellow或red),以及关于分片和节点的详细信息。
  3. GET /_cat/master

    • 这个API端点用于显示当前集群的主节点信息。主节点负责管理集群状态和分片的分配。
  4. GET /_cat/indices

    • 这个API端点用于列出集群中所有的索引。它会返回索引的名称、文档数量、数据大小、索引状态等信息。
      在这里插入图片描述

要使用这些API,需要通过HTTP客户端(如curl、Postman或任何其他HTTP工具)向Elasticsearch服务发送GET请求。例如,使用curl工具,可以这样发送请求:

curl -X GET "localhost:9200/_cat/nodes"

会返回Elasticsearch集群中所有节点的信息。注意,需要将localhost:9200替换为实际的Elasticsearch服务地址和端口。

二,106-全文检索-ElasticSearch-入门-put&post新增数据

保存一个数据,保存在哪个索引的哪个类型下,指定用哪个唯一标识。

// 在 customer 索引下保存 1 号数据为
POST customer/_doc/1
{"name": "John Doe"
}
  • customer,索引名称
  • _doc,type名称,索引下最多有一个type

响应结果如下。

在这里插入图片描述

注意,如果没有对应的索引,会自动创建索引,然后在索引下插入数据。比如调用这个API向customer索引插入一条数据,虽然没有提前创建customer索引,但是服务端会先创建索引,然后在这个索引下创建文档。

PUT 和 POST 的区别:

  • POST 可以新增可以修改。如果不指定 id,会自动生成 id。指定 id 就会修改这个数据,并新增版本号
  • PUT 可以新增可以修改。PUT 必须指定 id;由于 PUT 需要指定 id,我们一般都用来做修改
    操作,不指定 id 会报错。

三,107-全文检索-ElasticSearch-入门-get查询数据&乐观锁字段

查询一个id为1的文档。

GET customer/_doc/1

结果如下。

在这里插入图片描述

  • "_index" : "customer":这表示查询结果来自名为"customer"的索引。

  • "_type" : "_doc":这是文档的类型,在Elasticsearch 7.x版本之后,文档类型被废弃,统一使用_doc作为文档类型。

  • "_id" : "1":这是文档的唯一标识符,在Elasticsearch中,每个文档都有一个唯一的ID。

  • "_version" : 5:这表示文档的版本号,Elasticsearch使用版本号来处理文档更新和删除操作。

  • "_seq_no" : 8:这是文档的序列号,用于追踪文档在索引中的顺序。

  • "_primary_term" : 1:这是主分片的任期号,用于处理分片故障和恢复。

  • "found" : true:这表明查询找到了匹配的文档。

  • "_source" : { "name" : "John Doe" }:这是文档的原始数据部分,包含了文档的字段和值。在这个例子中,文档有一个字段name,其值为"John Doe"。

1,过时的乐观锁-version

Elasticsearch6以前的乐观锁是通过版本号(_version)来实现的。

乐观锁是一种并发控制机制,它假设在大多数情况下,多个进程或线程不会同时修改同一数据项。当一个进程或线程想要更新一个文档时,它会带上该文档的当前版本号。

如果在这个进程或线程读取文档之后,有其他进程或线程更新了该文档,导致版本号发生变化,那么Elasticsearch 会拒绝这个更新请求,并返回一个错误,提示版本冲突。

乐观锁的使用可以防止数据的并发更新导致的数据不一致问题。以下是如何使用Elasticsearch API 来构建一个测试用例的步骤:

  1. 创建索引:首先,你需要创建一个索引来存储文档。

    PUT /my_index
    {"settings": {"index": {"number_of_shards": 1,"number_of_replicas": 0}}
    }
    
  2. 索引文档:然后,索引一个文档,并记录下返回的版本号。

    POST /my_index/_doc/1
    {"name": "John Doe"
    }
    

    返回结果中会包含文档的版本号。

  3. 读取文档:读取文档以获取其当前版本号。

    GET /my_index/_doc/1
    

    返回结果中会包含文档的当前版本号。

  4. 模拟并发更新:在两个不同的会话或线程中,使用相同的版本号尝试更新同一个文档。

    会话1:

    POST /my_index/_update/1?version=1
    {"doc": {"name": "Jane Doe"}
    }
    

    会话2(几乎同时):

      POST /my_index/_update/1?version=1{"doc": {"name": "Alice Smith"}}
    

注意,如果es版本是7及更高版本,使用version作为乐观锁会报如下错误。

在这里插入图片描述

  1. 处理版本冲突:Elasticsearch 会处理这两个更新请求,但是只有一个会成功,另一个会因为版本冲突而失败。

    成功更新的会话将返回一个成功的状态,而失败的会话将返回一个错误,例如:

    {"error": {"root_cause": [{"type": "version_conflict_engine_exception","reason": "[my_index][1]: version conflict, current version [2] is different than the one provided [1]","index_uuid": "...","shard": "0","index": "my_index"}],"type": "version_conflict_engine_exception","reason": "[my_index][1]: version conflict, current version [2] is different than the one provided [1]","index_uuid": "...","shard": "0","index": "my_index"},"status": 409
    }
    

2,Elasticsearch7的乐观锁

Elasticsearch7已经引入了更先进的并发控制机制,使用if_seq_noif_primary_term参数进行文档更新和删除操作。

if_seq_noif_primary_term参数允许用户在执行更新或删除操作时指定期望的序列号和主分片任期号。

如果指定的序列号和任期号与当前文档的序列号和任期号不匹配,Elasticsearch将拒绝操作并返回错误。
以下是使用if_seq_noif_primary_term参数构建测试用例的步骤:

  1. 索引文档:首先,索引一个文档。

    POST /my_index/_doc/1
    {"name": "John Doe"
    }
    
  2. 获取文档的序列号和任期号:通过获取文档的详细信息来获取序列号(_seq_no)和主分片任期号(_primary_term)。

    GET /my_index/_doc/1
    
  3. 尝试更新文档:使用获取到的序列号和任期号尝试更新文档。

    POST /my_index/_update/1?if_seq_no=1&if_primary_term=1
    {"doc": {"name": "Jane Doe"}
    }
    

    在这个例子中,我们假设文档的初始序列号是1,任期号也是1。

  4. 并发更新:在另一个会话中,尝试使用相同的序列号和任期号更新同一个文档。

    POST /my_index/_update/1?if_seq_no=1&if_primary_term=1
    {"doc": {"name": "Alice Smith"}
    }
    
  5. 处理并发冲突:如果第一个更新操作成功,第二个更新操作将因为序列号或任期号不匹配而失败。

    失败的更新操作将返回一个错误,例如:

    {"error": {"root_cause": [{"type": "version_conflict_engine_exception","reason": "[my_index][1]: version conflict, required seq_no [1], primary term [1]. current document has seq_no [2] and primary term [1]"}],"type": "version_conflict_engine_exception","reason": "[my_index][1]: version conflict, required seq_no [1], primary term [1]. current document has seq_no [2] and primary term [1]"},"status": 409
    }
    

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

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

相关文章

计算机网络知识点面试总结4

#来自ウルトラマンゼロ(赛罗) 1 传输层提供的服务 1.1 功能 传输层向它上面的应用层提供通信服务,它属于面向部分的最高层,同时也是用户功能中的最底层。 为运行在不同主机上的进程之间提供了逻辑通信。 传输层的功能&#xff1…

【教程】从零开始用QT简易实现modbus通信

前言:本文旨在让读者了解在qt6中实现modbus通信主要使用哪些函数,需要引用哪些库和头文件,不对modbus协议进行介绍,仅在代码层面简单实现一个modbus通信案例 实现效果:点击读取按钮可以读取从机中的十个寄存器&#x…

【QT】鼠标按键事件 - QMouseEvent QKeyEvent

qt 事件 事件1. 事件概念2. 事件的处理3. 按键事件(1)单个按键(2)组合按键 4. 鼠标事件(1)鼠标单击事件(2)鼠标释放事件(3)鼠标双击事件(4&#x…

【数据分析】统计学基础及Python具体实现

各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

【Python】已解决:ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。: ‘e:\anaconda\in

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。: ‘e:\anaconda\install_root\scripts\pip.exe’ Consider using the --user o…

C语言详解(结构体)

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记,在这里撰写成文一…

【MAVEN】如何解决“Error unmarshaling return header; nested exception is: java.io.EOFException“?

目录标题 异常现场分析解决Chat GPT出场一下增大【Build process heap size (Mbytes) 】试试🙏增大【Maven->importing->VM options for importer】试试✅Idea的所有配置说明 异常现场 Error unmarshaling return header; nested exception is: java.io.EOFEx…

C++内存管理(区别C语言)深度对比

欢迎来到我的Blog,点击关注哦💕 前言 前面已经介绍了类和对象,对C面向对象编程已经有了全面认识,接下来要学习对语言学习比较重要的是对内存的管理。 一、内存的分区 代码区:存放程序的机器指令,通常是可…

IntelliJ IDEA安装教程(超详细)

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页: IDEA的使用 IDEA的简单介绍IDEA的主要优势IDEA的卸载IDEA的安装第一个程序:HelloWorld结束语 IDEA的简单介绍…

JAVA (Springboot) i18n国际化语言配置

JAVA i18n国际化语言配置 一、简介二、功能三、Java配置国际化步骤四、Java国际化配置工具类五、Spring Boot配置六、测试 一、简介 在Java中,国际化(Internationalization,通常简称为i18n)是一个过程,它允许应用程序…

【C语言项目】实现一个通讯录,一步一步详细讲解,小白也能看

目录 设计思路 代码实现 代码改造1 代码改造2 完整代码 代码仓库 设计思路 1. 通讯录存放的信息 这个通讯录保存的信息包括:名字,年龄,性别,电话,住址。 2. 通讯录的功能 1. 通讯录可以存放100个人的信息。 2…

2024年 Java 面试八股文(20w字)

> 🍅我是小宋, 一个只熬夜但不秃头的Java程序员。 > 🍅关注我,带你**过面试,读源码**。提升简历亮点(14个demo) > 🍅我的面试集已有12W 浏览量。 > 🌏号…

[C++] 深度剖析C_C++内存管理机制

文章目录 内存分布内存分布图解 C语言中动态内存管理方式malloc:callocrealloc C内存管理方式内置类型**自定义类型** operator new & operator deleteoperator new & operator delete函数operator newoperator delete **new T[N]** 与**delete[]** **定位new表达式(pl…

【C语言】指针由浅入深全方位详解!!!

目录 指针 野指针 二级指针 指针数组 字符指针 数组指针 数组参数,指针参数 函数指针 函数指针数组 回调函数 练习题 代码仓库 指针 1. 指针定义 1. 指针是内存中一个最小单元的编号,也就是地址。 2. 平时口语中说的指针&#xff…

【C++】如何巧妙运用C++命名空间:初学者必备指南

C语法相关知识点可以通过点击以下链接进行学习一起加油! 本篇将带领大家走进C的旅途,为了更好地学习C这门语言,我们需要了解它的前世今生。在了解完C如何诞生后,将开始我们C之旅第一站"命名空间"。(老早说是C/C博主&…

Java 集合框架:HashMap 的介绍、使用、原理与源码解析

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 020 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

零基础入门转录组数据分析——GO+KEGG富集分析

零基础入门转录组数据分析——GOKEGG富集分析 目录 零基础入门转录组数据分析——GOKEGG富集分析1. 富集分析基础知识2. GO富集分析(Rstudio)——代码实操3. KEGG富集分析(Rstudio)——代码实操注:配套资源只要改个路径…

PyQt5| 界面设计 |利用Qt Designer实现简单界面交互

目录 1 QtDesigner简单界面设计2 代码部分2.1 ui文件转py文件2.2 界面文件代码2.3 主文件代码2.3.1 主体框架代码2.3.2 实现交互代码 3结果展示 准备工作: 配置好PyQt5相关的库、QtDesigner、pyuic 1 QtDesigner简单界面设计 点击“工具"——>“外部工具&a…

Matlab实现最小二乘法的几种方法

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。 按照图中所提出的问题(如图1),要求已知多组解(自变量和因变量),求出最佳和最恰…

【C++/STL深度剖析】priority_queue 最全解析(什么是priority_queue? priority_queue的常用接口有哪些?)

目录 一、前言 二、如何区分【优先级队列】与【队列】? 三、priority_queue的介绍 四、priority_queue 的构造 五、priority_queue 的常用接口 💧push 💧pop 💧size 💧top 💧empty &…