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

文章目录

  • 一、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();    
	 }
}

接下来要在mysql查数据,写下Service层接口,让它继承MyBatisPlus的IService<PO>

import com.baomidou.mybatisplus.extension.service.IService;

public interface IHotelService extends IService<Hotel> {
}

1、新增文档

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

在这里插入图片描述

以上是简单逻辑和流程。注意MySQL中查出来的实体类字段和DSL下面的json字段不一样,这是tb_hotel表对应的实体类:

@Data
@TableName("tb_hotel")
public class Hotel {
    @TableId(type = IdType.INPUT)
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String longitude;
    private String latitude;
    private String pic;
}

这里写个新类HotelDoc,将Hotel类封装成为和ES索引库字段对应的类

@Data
@NoArgsConstructor
public class HotelDoc {
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String location; //!
    private String pic;

    public HotelDoc(Hotel hotel) {   //有参构造,传入要封装的对象
        this.id = hotel.getId();  //对于这些不用包装的字段,直接get到后赋值给包装对象的属性就行
        this.name = hotel.getName();
        this.address = hotel.getAddress();
        this.price = hotel.getPrice();
        this.score = hotel.getScore();
        this.brand = hotel.getBrand();
        this.city = hotel.getCity();
        this.starName = hotel.getStarName();
        this.business = hotel.getBusiness();  
        this.location = hotel.getLatitude() + ", " + hotel.getLongitude();   //注意这里
        this.pic = hotel.getPic();
    }
}

接下来实现去数据库查询酒店数据,导入到hotel索引库:

@Resource
IHotelService iHotelService;

@Test
void testIndexDocument() throws IOException {
 	//从MySQL查
     Hotel hotel = iHotelService.getById(60359L);   
     //封装
     HotelDoc hotelDoc = new HotelDoc(hotel);
     //创建request
     IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
     //放入要新增的json传
     request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
     //发请求
     client.index(request, RequestOptions.DEFAULT);
 }

2、查询文档

根据id查询到的文档数据是json,再反序列化成Java对象。代码和DSL语句的对比:

在这里插入图片描述

@Test
void testGetDocumentById() throws IOException {
    GetRequest request = new GetRequest("hotel","60359");
    GetResponse response = client.get(request,RequestOptions.DEFAULT);
    //看上图DSL执行返回结果中有个_source,这个getSource方法就是拿这个数据
    String json = response.getSourceAsString();
    //解析
    HotelDoc hotelDoc = JSON.parseObject(json,HotelDoc.class);
    System.out.println(hotelDoc);
}

在这里插入图片描述

3、修改文档

接下来根据id去修改ES文档的酒店数据。修改文档数据有两种方式:

方式一:全量更新。再次写入id一样的文档,就会删除旧文档,添加新文档
方式二:局部更新。只更新部分字段

实现下方式二:
在这里插入图片描述

@Test
void testUpdateDocumentById() throws IOException {
    UpdateRequest request = new UpdateRequest("hotel","60359");
    request.doc(
            "price","0.01",
            "startName","四星级"
    );
    client.update(request,RequestOptions.DEFAULT);
}

4、删除文档

根据id删除文档数据:

在这里插入图片描述

@Test
void testDeleteDocumentById() throws IOException {
    DeleteRequest request = new DeleteRequest("hotel","60359");
    client.delete(request,RequestOptions.DEFAULT);
}

再get已经无数据:

在这里插入图片描述


小结:
在这里插入图片描述

5、批量导入文档

接下来批量查询酒店数据,然后批量导入索引库中,实现思路:

  • 利用mybatis-plus查询酒店数据
  • 将查询到的酒店数据(Hotel)转换为文档类型数据(HotelDoc)
  • 利用JavaRestClient中的Bulk批处理,实现批量新增文档

代码逻辑:

在这里插入图片描述

@Test
void testBulk() throws IOException {
	//从MySQL查到所有数据
    List<Hotel> hotels = iHotelService.list();
    BulkRequest request = new BulkRequest();
    //遍历Hotel的对象集合
    for(Hotel hotel : hotels){
    	//Hotel转HotelDoc
        HotelDoc hotelDoc = new HotelDoc(hotel);
        //创建新增文档的Request对象
        request.add(new IndexRequest("hotel")
                .id(hotelDoc.getId().toString())
                .source(JSON.toJSONString(hotelDoc),XContentType.JSON)
        );
    }
    //发送请求
    client.bulk(request,RequestOptions.DEFAULT);



}

最后查询单个文档或者查所有:

//查所有
GET /hotel/_search

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux之CentOS_7.9卸载MySQL_5.7全过程实操手册

前言&#xff1a;接以上&#xff0c;前面记录了Windows和Linux环境的MySQL部署&#xff0c;那我们既然都部署完成验证测试那就来个卸载记录吧&#xff0c;便于闭环收尾。 环境&#xff1a; 1、CentOS-7.9-x86_64-DVD-2009.iso 2、MySQL-5.7.42-linux-glibc2.12-x86_641、关闭…

langchain系列1- langchain-ChatGLM

源码阅读 1 服务启动 (demo.queue(concurrency_count3).launch(server_name0.0.0.0,server_port7860,show_apiFalse,shareFalse,inbrowserFalse))这部分代码使用了 Gradio 库提供的两个函数&#xff1a;queue 和 launch。 在这里&#xff0c;demo 是一个 Interface 类的实例…

计算机网络 day3 广播风暴 - VLAN - Trunk

目录 广播风暴&#xff1a; 1.什么是广播风暴&#xff1f; 2.危害&#xff1a; 3.防范 STP生成树协议&#xff1a;(72条消息) 生成树协议 — STP_生成树协议步骤_一下子就醒了的博客-CSDN博客 VLAN&#xff1a; VLAN是什么&#xff1f; VLAN起到的作用&#xff1a; 广…

ChatGPT落地场景探索-数据库与大模型

目录 openGauss介绍 openGauss介绍 数据库与大模型 openGauss介绍 大模型与数据库 大模型为数据库带来的机遇 大模型解决数据库问题的挑战 数据库为大模型带来的价值 大模型大模型的发展趋势 趋势产品&#xff1a;Chat2DB 简介 特性 生产应用&#xff1a;基…

SpringBoot项目模块间通信的两种方式

说明&#xff1a;在微服务架构开发中&#xff0c;一个请求是通过模块之间的互相通信来完成的&#xff0c;如下面这个场景&#xff1a; 创建两个子模块&#xff1a;订单模块&#xff08;端口8081&#xff09;、用户模块&#xff08;端口8082&#xff09;&#xff0c;两个模块之…

设计模式--------行为型模式

行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在类间…

VSCODE VUE3 element-ui plaus 环境搭建

目录 一、VUE 1、安装VUE 2、创建项目 二、Element Plus 1、在项目目录中安装 Element Plus&#xff0c;执行 2、引入element 三、vscode 中运行 1、打开项目文件夹 2、点击debug&#xff0c;运行 1&#xff09;、首次lanch chrome时 2&#xff09;、lanch node.js …

MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)

一&#xff0c;MyCat入门 1.什么是mycat 官网&#xff1a;http://www.mycat.org.cn/​ mycat是数据库中间件 它可以干什么&#xff1f; 读写分离数据分片&#xff1a;垂直拆分&#xff0c;水平拆分多数据源整合 2.数据库中间件 ​ 中间件&#xff1a;是一类连接软件组件和…

十五、flex弹性元素的样式

目录&#xff1a; 1. 基本布局 2. 弹性元素的属性&#xff1a;flex-grow 3. 弹性元素的属性&#xff1a;flex-shrink 4. 弹性元素的属性&#xff1a;flex-basis 5. flex 统一设置这3个属性&#xff08;常用&#xff09; 6. order 一、基本布局 <style>*{margin: 0;paddin…

Arcgis之Python的Arcpy的点线面对象的创建处理和通过pandas读取txt中的经纬度坐标创建几何对象

前言 本节将介绍点线面对象的创建和处理。创建点对象有三个类&#xff0c;分别是Point、Multipoint、PointGeometry&#xff0c;创建线对象的类为Polyline&#xff0c;创建面对象的类为Polygon。 一、点对象的创建——Point 点对象经常与光标配合使用。点要素将返回单个点对…

抖音seo矩阵系统源码|需求文档编译说明(技术)

1.抖音seo矩阵系统文档开发流程 抖音SEO矩阵指的是一系列通过搜索引擎优化&#xff08;SEO&#xff09;技术和策略来提升抖音账号在搜索结果中排名的方法和工具。在抖音上&#xff0c;用户可以通过搜索关键词来查找与其相关的视频和账号。因此&#xff0c;抖音SEO矩阵的主要目…

Java阶段四Day11

Java阶段四Day11 文章目录 Java阶段四Day11Spring AOPElasticsearch1. 关于各种数据库的使用2. 关系型数据库中的索引3. 安装与启动elasticsearch4. 访问elasticsearch5. 使用elasticsearch分词6. elasticsearch文档的相关概念7. 使用elasticsearch添加数据7.1. 添加文档7.2. 查…

QT登录界面

1.效果图 2.代码 #include "widget.h" #include "ui_widget.h" #include <QApplication> #include <QWidget> #include <QtWidgets>Widget::Widget(QWidget *parent): QMainWindow(parent), ui(new Ui::Widget) {ui->setupUi(this);…

【CSS】浮动

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;HTMLCSS &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 浮动浮动的规则浮动的案例浮动的清除 浮动 float属性可以指定一个元素应沿其容器的…

deeplabv3+源码之慢慢解析 第二章datasets文件夹(1)voc.py--voc_cmap函数和download_extract函数

系列文章目录&#xff08;更新中&#xff09; 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之…

亚马逊云科技推出的一项完全托管的生成式AI服务——Amazon Bedrock

在全球生成式AI浪潮兴起之际&#xff0c;以“智联世界&#xff0c;生成未来”为主题的2023世界人工智能大会&#xff08;WAIC 2023&#xff09;于7月6日在上海世博中心拉开帷幕。大会首日&#xff0c;亚马逊云科技携生成式AI产品Amazon Bedrock亮相大会现场&#xff0c;亚马逊云…

Linux发行版Gentoo被发现有漏洞,在SQL注入方面存在安全风险

近日有消息表明&#xff0c;Gentoo Linux发行版中存在漏洞CVE-2023-28424&#xff0c;并且极有可能被黑客利用该漏洞进行SQL注入攻击。 据悉&#xff0c;研究人员从 GentooLinux的Soko搜索组件中找到了这个漏洞&#xff0c;并且该漏洞的CVSS风险评分为 9.1&#xff0c;属于特别…

使用Pytorch加载预训练模型及修改网络结构

Pytorch有自带的训练好的AlexNet、VGG、ResNet等网络架构。详见官网 1.加载预训练模型 import torch import torchvision import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import torchvision.transforms as transforms import torchvis…

【QQ好友列表-设置HeaderView Objective-C语言】

一、咱们一起来看 刚才咱们是不是给大家说到 创建好模型了 是不是单元格,我们需要自定义单元格了 自定义单元格的步骤: 我相信大家现在脑子里,应该有那个代码的思路了吧 1)首先,是不是要新建一个类型啊 这个类型应该建在哪个里面 是不是应该建在我们的View里面 View…

linux常见指令下

接下来我们就聊聊linux的后面十条指令。 一:echo 作用是往显示器输出内容&#xff0c;和printf类型&#xff0c;但是该指令最核心的是与之相关的一些概念 概念1.输出重定向&#xff1a; echo不仅可以向显示打印内容&#xff0c;还可以向文件输出内容&#xff0c;本应该输出到…