Elasticsearch文档操作:初学者指南(2023年最新版包含DSL语句的使用和RestHighLevelClient在Java中的使用)

news2025/2/27 14:01:32

2023年还没有学习Elasticsearch?,那么您将错过最强大、最通用的编程语言之一。

本文将介绍在Elasticsearch对文档分别使用DSL语句和Java High Level REST ClientAPI来对文档进行操作。获取更多信息查看官网帮助文档

在这里插入图片描述

运行环境:

Linux,docker

简介

Elasticsearch是一个分布式的RESTful搜索和分析引擎。它是建立在Lucene之上的,Lucene是一个强大的全文搜索引擎。Elasticsearch被设计为可伸缩、容错和易于使用。它被各种各样的组织使用,包括eBay、思Cisco和Spotify。

1.安装和启动elasticsearch和所需组件kibana

在docker中安装和配置Elasticsearch和Kibana版本控制在7.12.1,

相关配置的操作文档参考我另外一篇文章目录1.2.1

1.1.docker中运行成功

在这里插入图片描述

1.2.访问Linux的IP地址对应Kibana的端口号5601

在这里插入图片描述

访问网页“Linux的IP地址:5601/app/dev_tools#/console,kibana提供的可以控制ES的控制台
在这里插入图片描述

GET /

GET测试运行的到的信息和访问端口9200得到结果相同,则之前的配置文件生效,运行成功。

在这里插入图片描述

2.快速入门DSL语句和REST API的编写

在此之前也可以参考文章 目录1.1.3 ,了解什么是索引?,什么是文档。

2.1.创建索引

PUT /user
{
  "mappings": {
    "properties": {
      "id":{
        "type": "keyword"
      },
      "name":{
        "type": "text",
        "analyzer": "standard"
      },
      "age":{
        "type": "integer"
      },
      "address":{
        "type": "keyword"
      }
    }
  }
}

得到以下结果

在这里插入图片描述

以数据库为例,一个表有数据结构,和字段。Elasticsearch同样也有索引和文档,下表方便理解ES的索引结构,当然本身这两个技术并没有什么关系,这里只是用Mysql做例子方便理解。

在这里插入图片描述

MySqlElasticsearch说明
Table(table structure)Index索引,就是文档的集合,类似数据库的表
RowDocument文档,就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
ColumnField(字段)字段,就是JSON文档中的字段,类似数据库的列
SchemaMappingMapping是索引中文档的约束,列如字段类型约束。类似数据库的表结构
SQLDSLDSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

2.2.DSL语句实现CRUD

DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD,DSL代表领域特定语言。在Elasticsearch上下文中,DSL指的是一组工具和技术,这些工具和技术可以用一种更简洁、更富有表现力的方式与Elasticsearch交互。

2.2.1.DSL_新增文档

给指定的数据流或索引添加JSON文档使其可搜索,如果索引和文档已经存在,则会更新文档。

请求方式用法
POST创建文档
PUT重写和创建文档
POST /user/_doc/1
{
	"id":1,
	"name":"王五",
	"age":19,
	"address":"北京市海淀区颐和园路5号"
}

或者
PUT /user/_doc/1
{
	"id":1,
	"name":"王五",
	"age":19,
	"address":"北京市海淀区颐和园路5号"
}

结果图

在这里插入图片描述

PUT效果相同

2.2.1.DSL_新增文档扩展

请求参数在POST中的用法在PUT中的用法
_doc在添加一个索引(Index)不存在的文档时,ES会自动创建索引并且当请求方式为POST的时候文档允许省略ID,ES自动生成ID的同时生成索引。2.2.1.演示1在添加一个索引(Index)不存在的文档时,ES会自动创建索引并且当请求方式为PUT创建文档须指定ID,ES才会自动生成索引
_create在添加一个索引(Index)不存在的文档(Document)时,ES也会自动创建索引,但是两种都不允许省略ID。2.2.1.演示2

POST+_doc的请求格式,无ID的情况下,可以看到创建ES自动生成一个很复杂的ID并且索引自动创建

在这里插入图片描述

加上ID之后响应的ID为自定义的ID,索引也是自动创建

在这里插入图片描述

PUT+_doc的请求格式,无ID的情况下,

在这里插入图片描述

测试结果报错

当PUT携带ID的时候,添加成功并且自动创建对应的索引结构

在这里插入图片描述

警告:索引名不能有大写字母

在这里插入图片描述

非法索引名[testApart],必须小写,ES支持下划线的写法test_apart

**警告:**在默认情况下新建使用POST ,并且需要指定id,并且创建文档必须建立在已经创建了索引的基础上,ES自动生成不能保证索引结构能达到预期的结果。

2.2.2.DSL_删除文档

使用DELETE从索引中删除文档。必须指定索引名称和文档ID。

DELETE /索引名/_doc/id

2.2.3.DSL_更新文档

使用指定的脚本更新文档,修改有两种方法

  • 局部修改

    更新文档(优先用于更新)

    POST /索引名/_update/文档id
    {
    	"doc":{
    		"字段名":"新的值"
    	}
    }
    
  • 全局修改

    删除旧文档,添加新文档

    PUT /索引名/_doc/id
    {
    	"字段1":xxx,
    	"字段2":xxx,
    }
    

2.2.4.DSL_查看文档

  • GET API

    从索引中检索指定的JSON文档。

  • 请求类型

    GET <index>/_doc/<_id>
    
    GET <index>/_source/<_id>
    
    HEAD <index>/_doc/<_id>
    
    HEAD <index>/_source/<_id>
    
  • 描述

    使用GET从特定索引中检索文档和文档源或存储字段。使用HEAD验证文档是否存在。也可以使用_source资源只检索文档源或验证是否存在。

  • 测试

    • GET

      在这里插入图片描述

    • HEAD

      HEAD查到数据左图,查无数据右图

      在这里插入图片描述

2.3.RestAPI中JAVA语言实现CRUD

Java高级REST客户端工作在Java低级REST客户端之上。它的主要目标是公开特定于API的方法,这些方法接受请求对象作为参数并返回响应对象,这样请求编组和响应反编组就由客户机自己处理了。

2.3.1.配置maven依赖

<!--引入es的依赖,这个版本要和自己的es版本对应-->
        <dependency>            		 
        	<groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </dependency>

设定与docker中启动的ES版本一致,以7.12.1版本为例

<properties>
     <java.version>1.8</java.version>
     <elasticsearch.version>7.12.1</elasticsearch.version>
</properties>

2.3.2.建立与ES的连接

  • 在SpringBoot启动类中编写一个方法通过@Bean注入SpringFactory,推荐

    @Bean
    public RestHighLevelClient client(){
    	//IP服务器的地址  9200是elasticsearch的端口
    	return new RestHighLevelClient(RestClient.builder(HttpHost.create("192.168.26.131:9200")));
    } 
    

    需要时自动注入

    @Autowired
    private RestHighLevelClient client;
    
  • 在类中编写一个方法。

    private RestHighLevelClient client;
    
    public void setUp(){
    	client=new RestHighLevelClient(RestClient.builder(HttpHost.create("192.168.26.131:9200")));
    }
    

2.3.3.RestAPI_新增文档

新增总的来说有两种生成方式,一种是由字符串提供的文档源,另外是由Map提供的文档源

  • 由字符串(String)提供的文档源的新增

    package com.cn;
    
    import org.apache.http.HttpHost;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    @SpringBootTest
    class TestForRestApiApplicationTests {
    
        private RestHighLevelClient client;
    
        @BeforeEach
        void startUp(){
            client=new RestHighLevelClient(RestClient.builder(HttpHost.create("192.168.26.131:9200")));
        }
    
        @AfterEach
        void tearDown() throws IOException {
            client.close();
        }
    
        @Test
        void contextLoads() {
            System.out.println(client);
        }
    
    
        @Test
        void add1() throws IOException {
            IndexRequest request=new IndexRequest("user").id("1");
            String jsonString="" +
                    "{\n" +
                    "  \"id\":1,\n" +
                    "  \"name\":\"张三\",\n" +
                    "  \"age\":18,\n" +
                    "  \"address\":\"北京市朝阳区\"\n" +
                    "}";
            request.source(jsonString,XContentType.JSON);
            client.index(request,RequestOptions.DEFAULT);
        }
    
    }
    
    

    下图剖析执行流程与DSL语句的对应关系

    在这里插入图片描述

  • 由Map提供的文档源的新增,在官方文档中说明了Map可以自动转换为JSON格式

    package com.cn;
    
    import org.apache.http.HttpHost;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    @SpringBootTest
    class TestForRestApiApplicationTests {
    
        private RestHighLevelClient client;
    
        @BeforeEach
        void startUp(){
            client=new RestHighLevelClient(RestClient.builder(HttpHost.create("192.168.26.131:9200")));
        }
    
        @AfterEach
        void tearDown() throws IOException {
            client.close();
        }
    
        @Test
        void contextLoads() {
            System.out.println(client);
        }
    
    
        @Test
        void add2() throws IOException {
            Map<String,Object> map=new HashMap<>();
            map.put("id",2);
            map.put("name","小赵");
            map.put("age",10);
            map.put("address","成都市武侯区");
            //作为Map提供的文档源会自动转换为JSON格式
            IndexRequest request=new IndexRequest("user").source(map);
            client.index(request,RequestOptions.DEFAULT);
        }
    
    }
    
    

    剖析关系图

    在这里插入图片描述

总结:在开发中一般会定义一个与ES索引结构相同的实体类(User.java),封装所需参数,返回值类型为User.java

2.3.4.RestAPI_删除文档

删除比较简单

@Test
void delete() throws IOException {
		//准备DeleteRequest方法,指定索引名,和文档ID
        DeleteRequest request=new DeleteRequest("user").id("1");
		//发送删除请求
        client.delete(request,RequestOptions.DEFAULT);
    }

2.3.5.RestAPI_更新文档

  • 使用部分文档更新

    • String字符串的更新

      和新增逻辑相同,只不过请求参数变成UpdateRequest

      @Test
      void update() throws IOException {
              //准备request
              UpdateRequest request=new UpdateRequest("user","1");
              //准备Json数据
              String jsonString="" +
                      "{\n" +
                      "            \"id\":3,\n" +
                      "            \"name\":\"张胜男\",\n" +
                      "            \"age\":12,\n" +
                      "            \"address\":\"武汉市\"\n" +
                      "        }";
              request.doc(jsonString,XContentType.JSON);
              client.update(request,RequestOptions.DEFAULT);
          }
      

      代码分析图

      在这里插入图片描述

    • Map数组的更新

      @Test
          void update2() throws IOException {
              Map<String,Object> map=new HashMap<>();
              map.put("name","小赵");
              map.put("age",10);
              //准备request
              UpdateRequest request=new UpdateRequest("user","1").doc(map);
              //准备Json数据
              client.update(request,RequestOptions.DEFAULT);
          }
      

      这里就和使用Map新增的方法大同小异了

  • 使用脚本更新

    这里先引用一下官方的例子,等有空了在做详细的脚本更新

    //1
    Map<String, Object> parameters = singletonMap("user", "张三"); 
    //2
    Script inline = new Script(ScriptType.INLINE, "painless","ctx._source.field += params.count", parameters);  
    //3
    request.script(inline);  
    

    这段代码来自官方文档,可以看出

    1. 作为对象映射提供的脚本参数
    2. 使用简单的语言和前面的参数创建内联脚本
    3. 将脚本设置为更新请求

2.3.6.RestAPI_查看文档

@Test
void get() throws IOException {
        GetRequest request=new GetRequest("user","1");
        GetResponse response = client.get(request,RequestOptions.DEFAULT);
        System.out.println(response.getSourceAsString());
    }

以上是查看的代码

在这里插入图片描述

3.总结

本文提供了在ES中的分别使用原始DSL语句和JavaRestClient实现的CRUD的概述。最后,本文概述了Elasticsearch如何分别使用DSL语句和RestHighLevelClient处理文档。Elasticsearch是一个强大的工具,可以用来存储和搜索大量的数据。在DSL语句和RestHighLevelClient的帮助下,可以以各种方式与文档进行交互。如果你有兴趣学习更多关于Elasticsearch的知识.关注我,更新更多有用的免费的知识。

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

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

相关文章

驱动开发DAY6

非阻塞IO 在应用程序中读取硬件数据时&#xff0c;无论硬件数据是否准备完毕&#xff0c;read&#xff08;&#xff09;函数不会阻塞&#xff0c;继续向下执行 阻塞IO 当应用程序中读取硬件数据时&#xff0c;在硬件数据没有准备好时&#xff0c;进程会阻塞在read&#xff08;&…

C语言——如何写出好的代码?

哈喽&#xff0c;大家好&#xff0c;今天我们来学习如何才能写出优秀的代码&#xff0c;主要讲的是assert和const的用法。 首先&#xff0c;什么样的代码才算的上是优秀的代码呢&#xff1f;应该符合下面的要求&#xff1a; 1. 代码运行正常 2. bug很少 3. 效率高 4. 可读性高 …

自抗扰PID(梯形图源代码)

有关ADRC的详细算法和源代码,请参看专栏的系列文章,这里不再赘述,常用链接如下: ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法_RXXW_Dor的博客-CSDN博客PLC的自抗扰控制(ADRC)算法_RXXW_Dor的博客-CSDN博客_adrc算法1、自抗扰控制算法,网上很多文章有所…

x210---根文件系统制作

一、busybox的移植 1.1、busybox源码下载 (1)busybox是一个开源项目&#xff0c;所以源代码可以直接从网上下载。 (2)busybox的版本差异不大&#xff0c;版本新旧无所谓。 (3)下载busybox可以去linuxidc等镜像网站&#xff0c;也可以去www.busybox.net官方网站下载。 1.2、修…

技术人如何写简历?(文末有福利)

前言 笔者在滴滴、阿里和字节时候也面试了不少人&#xff0c;看过形形色色的简历没有上百也有大几十份了。校招季也快到了&#xff0c;这里总结自身经验聊一下 技术人的简历如何去写面试官是怎么样从一份简历去开展后续的面试 简历的作用 简历是你向一家公司求职的“敲门砖…

数据结构学习之路-集合

集合Set 集合的特点集合的内部实现&#xff08;使用链表&#xff09;集合的内部实现&#xff08;使用红黑树&#xff09;复杂度分析使用红黑树实现集合的限制 集合的特点 不存放重复的元素常用于去重 例如&#xff1a;存放新增的IP地址&#xff0c;统计新增IP量&#xff1b;存…

torch中的model.eval()、model.train()详解

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;工作总结链接&#xff1a;https://blog.csdn.net/qq_28949847/article/details/128552785 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c…

Laravel框架05:模型和自动验证

Laravel框架05&#xff1a;模型和自动验证 一、模型&#xff08;AR模式&#xff09;概述二、定义模型三、调用模型四、基本操作1. 添加数据① AR模式② Request 2. 查询数据3. 修改操作① AR模式② update 4. 删除操作 五、控制器验证1. 基本语法2. 输出错误信息 一、模型&…

今麦郎跻身“我最喜欢中国品牌”榜,致力领航中国品牌发展新范式

在中国经济探寻高质量发展的当下&#xff0c;中国民营企业肩负着推动经济发展的重任。在当前中国经济向上向前的大背景下&#xff0c;展示中国特色、传播中国文化、践行社会责任多位一体的高质量品牌越来越受到重视。但冰冻三尺非一日之功&#xff0c;唯有经历时间考验&#xf…

Spring:Spring 整合 MyBatis 的具体过程

文章目录 Spring&#xff1a;Day 04整合 MyBatis一、配置环境1. 导入依赖2. 准备一个数据库 二、用 Spring 整合 MyBatis1. 编写通用配置文件2. 编写实现类3. 编写 Spring 配置文件4. 测试5. 分析总结 三、拓展1. 实现2. 总结 四、事务1. 概述2. 没有事务时3. 声明式事务4. 总结…

“Shell“SNAT,DNAT

文章目录 一.SNAT1.1 SNAT原理1.2 SNAT的应用环境1.3 SNAT工作原理1.4 进行SNAT转换后1.5 配置SNAT策略1.6SNAT实验 二.DNAT2.1 DNAT工作原理2.2 配置DNAT策略2.3 DNAT实验 一.SNAT 1.1 SNAT原理 SNAT原理&#xff1a;修改数据包的源地址。SNAT 应用环境&#xff1a;局域网主…

基础学习——关于卷积层的记录

文章目录 前言一、功能层1、池化层2、nn.BatchNorm2d()3、全连接层4、softmax层 二、卷积层1、普通卷积2、空洞卷积3、多尺度卷积4、分组卷积5、深度可分离卷积6、形变卷积 前言 老是忘有些模块的具体作用&#xff0c;记录一下。 一、功能层 1、池化层 池化层夹在连续的卷积…

总结最全面的TCP、UDP、Socket、HTTP网络编程面试题

先看一天面试的经验&#xff1a; 第一场&#xff1a; 面试官&#xff1a;你说一下TCP的三次握手 我&#xff1a;第一次Client将SYN置1......、第二次Server收........、 第三次........ 面试官&#xff1a;很难背吧&#xff1f; 我&#xff1a;......是啊&#xff0c;很难&…

harbor安装

文章目录 先决条件硬件软件网络端口 安装docker签发证书生成证书颁发机构证书 生成服务器证书向 Harbor 和 Docker 提供证书 下载harbor安装包containerd 配置私有仓库&#xff08;二选一&#xff09;分发证书(如上文只是路径变了)配置登录加密登录打标签并推送与拉取 docker 配…

【EasyPoi实战系列】Spring Boot使用EasyPoi动态控制导出的列 - 第471篇

历史文章&#xff08;文章累计460&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 用…

机器学习神经网络——GBDT(Gradient Boosting Decision Tree 梯度提升决策树)算法

系列文章目录 机器学习神经网络——Adaboost分离器算法 机器学习之SVM分类器介绍——核函数、SVM分类器的使用 机器学习的一些常见算法介绍【线性回归&#xff0c;岭回归&#xff0c;套索回归&#xff0c;弹性网络】 文章目录 系列文章目录 前言 一、GBDT(Gradient Boos…

计算机网络:物理层

物理层 1. 通信基础1.1 基本概念1.1.1 通信模型1.1.2 通信方式1.1.3 数据传输方式1.1.4 数据同步的传输/通信方式1.1.5 码元1.1.6 速率1.1.7 带宽 1.2 奈氏准则|香农定理1.2.1 奈氏准则1.2.2 香农定理 1.3 编码、调制1.3.1 数字数据编码为数字信号1.3.2 数字数据调制为模拟信号…

Google Colab的使用方法

什么是 Google Colab&#xff1f; Colaboratory是一个 Google 研究项目&#xff0c;旨在帮助传播机器学习培训和研究成果。是一个Jupyter 笔记本环境&#xff0c;不需要进行任何设置就可以使用&#xff0c;并且完全在云端运行。Colaboratory笔记本存储在 Google 云端硬盘中&…

“超级品牌”已成型!解码名创优品的进阶之路

随着经济复苏&#xff0c;消费者心智和市场趋势逐渐发生变化&#xff0c;零售市场竞争步入深水区&#xff0c;为品牌带来了更大考验。但反过来&#xff0c;也令更多潜力股加速崛起。 北京时间5月16日&#xff0c;名创优品集团&#xff08;NYSE:MNSO;HKEX: 9896&#xff09;公布…

ResourceManager启动报错:Queue configuration missing child queue names for root【已解决】

Queue configuration missing child queue names for root 现象报错分析ResourceManager输出日志解决 现象 start-all.sh后缺少RM的进程 报错 查看启动日志输出文件 2023-05-23 19:28:19,863 INFO [main] resourcemanager.RMNMInfo (RMNMInfo.java:<init>(63)) - Re…