【ElasticSearch】JavaRestClient实现索引库和文档的增删改查

news2024/11/25 0:26:34

文章目录

  • 一、RestClient
    • 1、什么是RestClient
    • 2、导入demo工程
    • 3、数据结构分析与索引库创建
    • 4、初始化JavaRestClient
  • 二、RestClient操作索引库
    • 1、创建索引库
    • 2、删除索引库
    • 3、判断索引库是否存在
  • 三、RestClient操作文档
    • 1、新增文档
    • 2、查询文档
    • 3、删除文档
    • 4、修改文档
    • 5、批量导入文档

一、RestClient

1、什么是RestClient

ES官方提供了各种不同语言的客户端,用来操作ES,即RestClient。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。

官方文档地址:
https://www.elastic.co/guide/en/elasticsearch/client/index.html

在这里插入图片描述
在这里插入图片描述

2、导入demo工程

数据库信息如下:

mysql -h localhost -P3306 -uroot -padmian123 testDB < tb_hotel.sql

在这里插入图片描述

导入demo工程,基本结构如下:

在这里插入图片描述

3、数据结构分析与索引库创建

ES的mapping要考虑的点主要有:

  • 字段名(name)
  • 字段类型(type)
  • 是否参与搜索(index)
  • 是否分词(type/keyword)
  • 分词时,分词器用哪种(analyzer)

接下来,照着表结构,创建ES索引库:

在这里插入图片描述

PUT /hotel
{
  "mappings": {
    "properties":{
      "id":{
        "type": "keyword"  //注意这个类型
      },
      "name":{
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "all"
      },
      "address":{
        "type": "keyword", 
        "index": false   //根据业务场景,用户刚来,不会去搜地址address,不参与搜索,index改为false,不再默认,类型选用keyword
      },
      "price":{
        "type": "integer"
      },
      "score":{   //price、score等将来要参与过滤和排序,需要index,用默认的true
        "type": "integer"
      },
      "brand":{  //city、brand品牌参与搜索,且不分词
        "type":"keyword",
        "copy_to": "all"
      },
      "city":{
        "type":"keyword"
      },
      "starName":{  //不用下划线
        "type":"keyword"
      },
      "business":{
        "type": "keyword",
        "copy_to": "all"
      },
      "location":{
        "type":"geo_point"   //经纬度两个字段合并为location,用ES的特定类型geo_point
      },
      "pic":{
        "type": "keyword",
        "index": false  //pic既不分词,也不搜索
      },
      "all":{  //copy_to用的
        "type":"text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

用户就输入一个虹桥,我既想返回地址带虹桥的,也想返回商圈在虹桥的,还想返回酒店名称带虹桥的,如何实现?

加all字段,给需要的字段里加上从copy_to,这样all字段就可以代表这些加了copy_to的字段。实现了在一个字段里搜到多个字段的内容。

在这里插入图片描述
在这里插入图片描述

4、初始化JavaRestClient

  • 引入es的RestHighLevelClient依赖
<dependency>   
	<groupId>org.elasticsearch.client</groupId>    
	<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

  • 因为SpringBoot下默认的ES版本是7.6.2,所以我们需要定义properties覆盖默认的ES版本
<properties>    
	<java.version>1.8</java.version>    
	<elasticsearch.version>7.12.1</elasticsearch.version> 
</properties>

  • 初始化RestHighLevelClient
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(       
			HttpHost.create("http://10.4.130.110:9200"),
			HttpHost.create("http://10.4.130.111:9200"),
			HttpHost.create("http://10.4.130.112:9200")  //集群模式写多个
));

在单元测试里看下效果,打印restHighLevelClient对象:
在这里插入图片描述
在这里插入图片描述

二、RestClient操作索引库

1、创建索引库

示例代码:

@Test
void testCreateHotelIndex() throws IOException {    
	// 1.创建Request对象    
	CreateIndexRequest request = new CreateIndexRequest("hotel");    
	// 2.请求参数,MAPPING_TEMPLATE是静态常量字符串,内容是创建索引库的DSL语句    
	request.source(MAPPING_TEMPLATE, XContentType.JSON);    
	// 3.发起请求    
	client.indices().create(request, RequestOptions.DEFAULT);
}

在这里插入图片描述
将创建索引库的DSL语句以静态字符串常量的形式统一写在常量类里:

在这里插入图片描述
运行完成后,查看ES索引库:

GET /hotel

在这里插入图片描述

整个过程,和我们去Kiana手动执行DSL对比:

在这里插入图片描述

2、删除索引库

示例代码:

@Test
void testDeleteHotelIndex() throws IOException {  
	// 1.创建Request对象     
	DeleteIndexRequest request = new DeleteIndexRequest("hotel");    
	// 2.发起请求    
	client.indices().delete(request, RequestOptions.DEFAULT);
}

3、判断索引库是否存在

示例代码:

@Test
void testExistsHotelIndex() throws IOException {
    // 1.创建Request对象    
    GetIndexRequest request = new GetIndexRequest("hotel");    
    // 2.发起请求     
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);    
    // 3.输出    
    System.out.println(exists);
}

在这里插入图片描述

小结:

在这里插入图片描述

三、RestClient操作文档

接下来利用JavaRestClient实现文档的CRUD,去数据库查询酒店数据,导入到hotel索引库,实现酒店数据的CRUD。

和操作索引库一样,还是要先完成JavaRestClient的初始化:

public class ElasticsearchDocumentTest {   
	// 客户端   
	private RestHighLevelClient client; 
	        
	@BeforeEach    
	void setUp() {        
	client = new RestHighLevelClient(RestClient.builder(
	               HttpHost.create("http://192.168.150.101:9200")
	 ));    
	 }  
	  
	 @AfterEach    
	 void tearDown() throws IOException {        
	 client.close();    
	 }
}

1、新增文档

先看下DSL语法和使用JavaRestClient操作代码来实现的对比:

在这里插入图片描述

2、查询文档

3、删除文档

4、修改文档

5、批量导入文档

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

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

相关文章

视觉SLAM-光流法

文章目录 目录 前言 &#x1f31f;光流法的基本原理 &#x1f31f;OpenCV中的光流法实现 &#x1f31f;光流法的应用 &#x1f31f;代码实现 &#x1f349;OpenCV代码 &#x1f349;OpenCV代码 &#x1f31f;总结 前言 当我们观察一个视频或连续帧的图像时&#xff0c…

【Bubbliiiing视频记录】Pytorch 搭建自己的Unet语义分割平台

来源 b站 地址 什么是语义分割 语义分割&#xff1a;对图像每个像素点进行分类 常见神经网络处理过程&#xff1a;Encoder提取特征&#xff0c;接着Docoder恢复成原图大小的图片 UNet整体结构 分为三个部分 主干特征提取部分&#xff1a; 卷积和最大池化的堆叠获得五个初…

Snail-Camunda

gitee地址&#xff1a;snail-camunda 当前版本&#xff1a;V1.0 &#x1f496;&#x1f496;&#x1f496;希望大家动动发财的小手帮忙star一下&#xff0c;感谢&#xff01; ⭐项目介绍 本项目是对Camunda接口…

data和filter协议文件包含

实验目的 通过本实验&#xff0c;了解php封装伪协议&#xff0c;掌握filter协议和data协议的用法 实验环境 操作机&#xff1a;kali 靶机&#xff1a;Windows Server 2003 实验地址&#xff1a;http://靶机ip/exp/include2/filter/ http://靶机ip/exp/include/include3.php…

【C++ OJ练习】1.求和

1.题目链接 求123...n_牛客题霸_牛客网 2.解题思路 利用C构造函数的特性 既然不能使用循环 那么我们可以定义n个对象 就会调用n次构造函数 去代替循环 每次调用的时候进行加法的计算 3.代码 class Sum { public:Sum(){_sum _i;_i;}static void Init(){_i 1;_sum 0;}st…

ruoyi若依 组织架构设计--[ 菜单管理 ]

ruoyi若依 组织架构设计--[ 菜单管理 ] 1. 关于ruoyi组织架构各个表的设计2. 从产品的角度考虑 [ 菜单管理 ]2.1菜单树List页面2.2 菜单树新增2.3 菜单树修改2.4 删除菜单 1. 关于ruoyi组织架构各个表的设计 1.部门表 ancestors字段。 添加这个字段&#xff0c;方便列举所有子…

用maven安装Netty

Netty简单介绍 官网&#xff1a;https://netty.io/index.html Netty是一个异步的、事件驱动的网络应用框架&#xff0c;既可用于开发高性能的服务端&#xff0c;也可用于开发客户端。 Netty是一个NIO的客户端和服务端框架&#xff0c;用于快速、容易地开发网络应用&#xff0c…

Linux·图解Linux网络包接收过程

因为要对百万、千万、甚至是过亿的用户提供各种网络服务&#xff0c;所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高并发&#xff0c;要理解性能开销&#xff0c;会进行性能优化。而很多时候&#xff0c;如果你对Linux底层的理解不深的话&…

Paddle OCR 安装使用教程

简介 PaddleOCR是飞浆开源文字识别模型&#xff0c;最新开源的超轻量PP-OCRv3模型大小仅为16.2M。同时支持中英文识别&#xff1b;支持倾斜、竖排等多种方向文字识别&#xff1b;支持GPU、CPU预测&#xff0c;并且支持使用paddle开源组件训练自己的超轻量模型&#xff0c;对于…

微信小程序路由跳转,API调用,页面传值

路由跳转 wx.switchTab 跳转到 tabBar 页面&#xff0c;并关闭其他所有非 tabBar 页面。 wx.switchTab({url: /pages/tarbar/index })wx.reLaunch 关闭所有页面&#xff0c;打开到应用内的某个页面。 wx.reLaunch({url: /pages/index/index })wx.redirectTo 关闭当前页面…

13服务端实战:初始化项目

本章开始将进行服务端的实战开发&#xff0c;包含了 Devops、服务端以及其他涉及到的中间件的模块。 由于 NestJS 的文档非常完善以及之前有写过比较完整的 NestJS 的小册&#xff0c;如果对 NestJS 非常熟悉的同学可以快速跳过本章&#xff0c;另外整个实战篇的代码都会按照流…

shell命令以及运行原理、Linux权限、粘滞位

今天我带来Linux重点知识&#xff1a;shell命令以及运行原理、Linux权限、粘滞位的知识点。 目录 shell命令以及运行原理Linux权限的概念Linux下的用户su命令 Linux权限管理文件访问者的分类文件的类型和访问权限文件权限值的表达方法 Linux关于权限的知识点补充1.Linux创建用户…

Unity3d C#使用XCharts数据显示格式说明(如:数据类型、数据显示为百分比%等)

前言 XCharts是开源且比较强大的插件&#xff0c;在Unity3d中搭建UI时常常使用的数据图表的制作插件&#xff0c; 特别是当下的数字沙盘、数字孪生等项目中应用较广。笔者公司也一直在使用该插件&#xff0c;本文主要是在开发过程中的一个小需求引发的整理分享。在项目中需要将…

vue2 若依项目,使用plotly.js-dist图表库,将数据图表一键导出为图片

此代码适用的场景是一个页面有多个数据图表。 首先需要拿到你生成数据图表的数据&#xff0c; 然后赋值给一个数组&#xff0c;数组需要在data定义&#xff0c;还需要去重。 // 检查是否有相同的parameter值const hasDuplicate this.toImageArr.some(iiem > iiem.paramete…

由于找不到xinput1_3.dll,无法继续执行代码的解决方法都有哪些?

关于由于找不到xinput1_3.dll,无法继续执行代码这个问题&#xff0c;其实在网上经常看别人提及&#xff0c;要解决这个问题&#xff0c;还是不难的&#xff0c;今天小编就来给大家详细的说说关于这个问题的解决方法吧&#xff0c;本文会介绍多种的修复方法&#xff0c;下面一起…

商品数据封装接口(PHP/Java/Python)

封装 在面向对象程式设计方法中&#xff0c;封装是指—种将抽象性函式接口的实现细节部分包装、隐藏起来的方法 封装可以被认为是一个保护屏障&#xff0c;防止该类的代码和数据被外部类定义的代码随机访问 要访问该类的代码和数据&#xff0c;必须通过严格的接口控制 封装最…

提升生产效率的关键:如何选择适合您企业的设备管理系统?

在现代工业生产中&#xff0c;设备管理对于提升生产效率和降低成本至关重要。一个高效的设备管理系统可以帮助企业实现设备的有效监控、维护和优化&#xff0c;从而提高设备的可靠性、降低停机时间&#xff0c;并最终提升生产效率。选择适合企业的设备管理系统可能是一个复杂的…

Vision Pro:多人XR协作这样玩才对味

早在iOS 15系统更新中&#xff0c;苹果就推出了SharePlay功能&#xff0c;该功能主要针对多人协作和社交&#xff0c;允许用户在FaceTime会话中一起看剧、听歌、共享屏幕。Vision Pro头显也支持该功能&#xff0c;允许用户共享AR图像和空间上下文信息&#xff0c;实现远程可视化…

LeetCode 每日一题——2178. 拆分成最多数目的正偶数之和

1.题目描述 2178. 拆分成最多数目的正偶数之和 给你一个整数 finalSum 。请你将它拆分成若干个 互不相同 的正偶数之和&#xff0c;且拆分出来的正偶数数目 最多 。 比方说&#xff0c;给你 finalSum 12 &#xff0c;那么这些拆分是 符合要求 的&#xff08;互不相同的正偶…

Spring Boot 中的服务发现

Spring Boot 中的服务发现 Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它提供了很多工具和组件来简化 Web 应用程序的开发。其中&#xff0c;服务发现是 Spring Boot 中的一个非常重要的组件&#xff0c;它可以帮助我们自动地发现和管理应用程序中的服务。 什…