ElasticSearch学习笔记(二)文档操作、RestHighLevelClient的使用

news2024/10/23 6:26:08

文章目录

  • 前言
  • 3 文档操作
    • 3.1 新增文档
    • 3.2 查询文档
    • 3.3 修改文档
      • 3.3.1 全量修改
      • 3.3.2 增量修改
    • 3.4 删除文档
  • 4 RestAPI
    • 4.1 创建数据库和表
    • 4.2 创建项目
    • 4.3 mapping映射分析
    • 4.4 初始化客户端
    • 4.5 创建索引库
    • 4.6 判断索引库是否存在
    • 4.7 删除索引库
  • 5 RestClient操作文档
    • 5.1 准备工作
    • 5.2 新增文档
    • 5.3 查询文档

前言

ElasticSearch学习笔记(一)倒排索引、ES和Kibana安装、索引操作

3 文档操作

3.1 新增文档

语法:

POST /{索引库名}/_doc/{文档id}
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1":"值3",
        "子属性2":"值4"
    }
    // ...
}

3.2 查询文档

语法:

GET /{索引库名}/_doc/{文档id}

3.3 修改文档

3.3.1 全量修改

全量修改是覆盖原来的文档,其本质是先根据指定的id删除文档(id对应的文档不存在也可以),再新增一个相同id的文档。

语法:

PUT /{索引库名}/_doc/{文档id}
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1":"值3",
        "子属性2":"值4"
    }
    // ...
}

3.3.2 增量修改

增量修改是只修改指定id匹配的文档中的部分字段。

语法:

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

3.4 删除文档

语法:

DELETE /{索引库名}/_doc/{文档id}

4 RestAPI

ES官方提供了各种不同语言的客户端用来操作ES,这些客户端的本质是组装DSL语句,通过Http请求发送给ES。其官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html

其中Java语言的客户端分为两种:

本文章学习的是high-level REST client。

4.1 创建数据库和表

CREATE DATABASE hsgx;
USE hsgx;
CREATE TABLE tb_hotel (
	`id` BIGINT(20) NOT NULL PRIMARY KEY COMMENT '酒店id',
	`name` VARCHAR(255) NOT NULL COMMENT '酒店名称',
	`address` VARCHAR(255) NOT NULL COMMENT '酒店地址',
	`price` INT(10) NOT NULL COMMENT '酒店价格',
	`score` INT(2) NOT NULL COMMENT '酒店评分',
	`brand` VARCHAR(32) NOT NULL COMMENT '酒店品牌',
	`city` VARCHAR(32) NOT NULL COMMENT '所在城市',
	`star_name` VARCHAR(16) NOT NULL COMMENT '酒店星级',
	`business` VARCHAR(255) NOT NULL COMMENT '商圈',
	`latitude` VARCHAR(32) NOT NULL COMMENT '纬度',
	`longitude` VARCHAR(32) NOT NULL COMMENT '经度',
	`pic` VARCHAR(255) DEFAULT NULL COMMENT '酒店图片'
);

INSERT INTO tb_hotel(`id`, `name`, `address`, `price`, `score`, `brand`, `city`, `star_name`, `business`, `latitude`, `longitude`, `pic`) 
VALUES (1, '白天鹅', '中山路', 888, 5, '白天鹅', '广州', '五星', '太古汇', '123.456', '456.748', 'a.png'),
(2, '希尔顿', '南京路', 456, 4.5, '希尔顿', '上海', '四星', '外滩', '123.456', '456.748', 'b.png');

4.2 创建项目

在IDEA中创建一个maven项目,结构如下:

4.3 mapping映射分析

mapping映射分析要考虑的信息包括:

  • 字段名:参考表结构。
  • 字段数据类型:参考表结构。
  • 是否参与搜索:根据具体业务进行判断。
  • 是否需要分词:根据具体内容进行判断,如果内容是一个整体就无需分词,反之则要分词。
  • 分词器是什么:可以统一使用ik_max_word。

对应到tb_hotel表,我们可以新建如下索引:

PUT /hotel
{
    "mappings": {
        "properties": {
            "id": {
                "type": "integer"
            },
            "name":{
                "type": "text",
                "analyzer": "ik_max_word",
                "copy_to": "all"
            },
            "address":{
                "type": "text",
                "analyzer": "ik_max_word",
                "index": false
            },
            "price":{
                "type": "integer"
            },
            "score":{
                "type": "integer"
            },
            "brand":{
                "type": "keyword",
                "copy_to": "all"
            },
            "city":{
                "type": "keyword",
                "copy_to": "all"
            },
            "starName":{
                "type": "keyword"
            },
            "business":{
                "type": "keyword"
            },
            "pic":{
                "type": "keyword",
                "index": false
            },
            "location":{
                "type": "geo_point"
            },
            "all":{
                "type": "text",
                "analyzer": "ik_max_word"
            }
        }
    }
}

其中,有两个比较特殊的字段:

  • location:地理坐标,类型是geo_point,表示由经度(latitude)和纬度(longitude)确定一个点。
  • all:一个组合字段,其目的是将多字段的值 利用copy_to属性合并,提供给用户搜索。在上面的例子中,namebrandcity字段会合并到一起。

4.4 初始化客户端

Java客户端中,与ES一切交互都封装在一个名为RestHighLevelClient的类中,必须先完成这个对象的初始化,建立与ES的连接。主要步骤如下:

  • 1)引入依赖,注意版本号和安装的ES版本一致
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.12.1</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>7.12.1</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.12.1</version>
</dependency>
  • 2)初始化RestHighLevelClient
private RestHighLevelClient client;

@Before
void setUp() {
    this.client = new RestHighLevelClient(RestClient.builder(
            HttpHost.create("http://192.168.153.128:9200")
    ));
}

@After
void close() throws IOException {
    this.client.close();
}

4.5 创建索引库

private static final String DSL = "{\n" +
        "    \"mappings\": {\n" +
        "        \"properties\": {\n" +
        "            \"id\": {\n" +
        "                \"type\": \"integer\"\n" +
        "            },\n" +
        "            \"name\":{\n" +
        "                \"type\": \"text\",\n" +
        "                \"analyzer\": \"ik_max_word\",\n" +
        "                \"copy_to\": \"all\"\n" +
        "            },\n" +
        "            \"address\":{\n" +
        "                \"type\": \"text\",\n" +
        "                \"analyzer\": \"ik_max_word\",\n" +
        "                \"index\": false\n" +
        "            },\n" +
        "            \"price\":{\n" +
        "                \"type\": \"integer\"\n" +
        "            },\n" +
        "            \"score\":{\n" +
        "                \"type\": \"integer\"\n" +
        "            },\n" +
        "            \"brand\":{\n" +
        "                \"type\": \"keyword\",\n" +
        "                \"copy_to\": \"all\"\n" +
        "            },\n" +
        "            \"city\":{\n" +
        "                \"type\": \"keyword\",\n" +
        "                \"copy_to\": \"all\"\n" +
        "            },\n" +
        "            \"starName\":{\n" +
        "                \"type\": \"keyword\"\n" +
        "            },\n" +
        "            \"business\":{\n" +
        "                \"type\": \"keyword\"\n" +
        "            },\n" +
        "            \"pic\":{\n" +
        "                \"type\": \"keyword\",\n" +
        "                \"index\": false\n" +
        "            },\n" +
        "            \"location\":{\n" +
        "                \"type\": \"geo_point\"\n" +
        "            },\n" +
        "            \"all\":{\n" +
        "                \"type\": \"text\",\n" +
        "                \"analyzer\": \"ik_max_word\"\n" +
        "            }\n" +
        "        }\n" +
        "    }\n" +
        "}";

@Test
public void testCreateHotelIndex() throws IOException {
    // 1.参数为索引库名称
    CreateIndexRequest createIndexRequest = new CreateIndexRequest("hotel");
    // 2.设置mapping映射
    createIndexRequest.source(DSL, XContentType.JSON);
    // 3.发起创建索引库请求
    client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
}

由以上代码可知,创建索引库的步骤主要又三步:

  • 1)创建Request对象。创建索引库的操作对应的Request对象是CreateIndexRequest。
  • 2)设置mapping映射,其实就是DSL的JSON参数部分。因为JSON字符串很长,所以定义了一个静态字符串常量来表示,让代码看起来更加优雅。
  • 3)发送创建索引库请求,client.indices()方法的返回值是IndicesClient类型,封装了所有与索引库操作有关的方法。

执行以上单元测试,在DevTools工具中查询该索引库:

4.6 判断索引库是否存在

判断索引库是否存在,本质是使用GET命令查询索引库,因此它对应的Request对象是GetIndexRequest。

@Test
public void testExistsHotelIndex() throws IOException {
    // 1.参数为索引库名称
    GetIndexRequest request = new GetIndexRequest("hotel");
    // 2.发送请求
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    // 3.输出
    System.err.println(exists ? "索引库已经存在!" : "索引库不存在!");
}

执行以上单元测试,结果如下:

4.7 删除索引库

删除索引库对应的Request对象是DeleteIndexRequest。

@Test
public void testDeleteHotelIndex() throws IOException {
    // 1.参数为索引库名称
    DeleteIndexRequest request = new DeleteIndexRequest("hotel");
    // 2.发送请求
    client.indices().delete(request, RequestOptions.DEFAULT);
}

执行以上单元测试,在DevTools工具中查询该索引库:

5 RestClient操作文档

5.1 准备工作

由于上文定义的索引库hotel的mapping映射与数据库表结构有一些差异,因此还需要定义一个新的实体类,与索引库的mapping映射对应起来:

@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();
        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();
    }
}

主要的区别在于,将latitudelongitude两个字段合并为location一个字段。

5.2 新增文档

新增文档的DSL语句示例如下:

POST /hotel/_doc/1
{
    "name": "白天鹅",
    "score": 5
}

对应的Java代码如下:

@Test
public void testCreateDocIndex() throws IOException {
    // 1.POST /hotel/_doc/1 { "name": "白天鹅", "score": 5 }
    IndexRequest request = new IndexRequest("hotel").id("1");
    request.source("{\"name\": \"白天鹅\", \"score\": 5}", XContentType.JSON)
    // 2.发送请求
    client.index(request, RequestOptions.DEFAULT);
}

执行以上单元测试,在DevTools工具中查询该文档:

下面实现把数据库tb_hotel表的数据读取出来,并保存到ES中:

@Test
public void testSaveHotel() throws IOException {
    // 1.根据id查询酒店数据
    Hotel hotel = hotelService.getById(2);
    // 2.转换为文档类型
    HotelDoc hotelDoc = new HotelDoc(hotel);
    // 3.将HotelDoc转json
    String json = JSON.toJSONString(hotelDoc);
    // 4.准备Request对象
    IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
    // 5.准备Json文档
    request.source(json, XContentType.JSON);
    // 6.发送请求
    client.index(request, RequestOptions.DEFAULT);
}

执行以上单元测试,在DevTools工具中查询该文档:

在这里插入图片描述

5.3 查询文档

新增文档的DSL语句示例如下:

GET /hotel/_doc/2

对应的Java代码如下:

@Test
public void testQueryHotelDoc() throws IOException {
    // 1.创建Request对象
    GetRequest request = new GetRequest("hotel", "2");
    // 2.发送请求
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    // 3.解析结果
    String json = response.getSourceAsString();
    HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
    System.out.println(hotelDoc);
}

执行以上单元测试,结果如下:

在这里插入图片描述

本节完,更多内容请查阅分类专栏:微服务学习笔记

感兴趣的读者还可以查阅我的另外几个专栏:

  • SpringBoot源码解读与原理分析
  • MyBatis3源码深度解析
  • Redis从入门到精通
  • MyBatisPlus详解
  • SpringCloud学习笔记

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

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

相关文章

怎么把答案去掉打印?超详细步骤告诉你!

在数字化教育日益普及的今天&#xff0c;我们时常需要在电子试卷和纸质试卷之间进行转换。然而&#xff0c;许多时候我们并不需要答案部分&#xff0c;这就需要我们掌握一些工具来去除答案&#xff0c;以便打印出纯净的试卷。本文将为您详细介绍如何使用试卷星、拍试卷以及WPS …

Srouce Insight 4出现乱码

今天用SI4打开一个工程文件&#xff0c;一打开发现注释全是乱码。中文全部看不出来&#xff0c;英文和数字可以看得出来。 那是因为中文的编码格式不算特别兼容。所以需要调整编码格式。 于是我在这里调整了编码格式&#xff1a; 找到菜单的Options-Preferences里面的Files 调…

数据集MNIST手写体识别 pyqt5+Pytorch/TensorFlow

GitHub - LINHYYY/Real-time-handwritten-digit-recognition: VGG16和PyQt5的实时手写数字识别/Real-time handwritten digit recognition for VGG16 and PyQt5 pyqt5Pytorch内容已进行开源&#xff0c;链接如上&#xff0c;请遵守开源协议维护开源环境&#xff0c;如果觉得内…

Linux 系统图像化编程GTK入门

环境前期准备 演示环境&#xff1a;Windows 11 Ubuntu 22.04.4 VS Code 前提条件&#xff1a;1、Windows 11 子系统Ubuntu 22.04.4 已经安装图形化界面&#xff0c;如果没有安装请参考文章&#xff1a; windows11子系统Ubuntu 22.04.4子安装图形化界面 2、Ubuntu 22.04.4…

戏剧之家杂志戏剧之家杂志社戏剧之家编辑部2024年第14期目录

文艺评论 南戏瓯剧跨文化传播研究 陈晓东;高阳;许赛梦; 3-7 论互联网时代的戏剧传播与批评——以西法大剧社和南山剧社为例 邬慧敏; 8-10 “左手荒诞&#xff0c;右手温情”——《西西弗神话》在戏剧《第七天》中的接受探究 赵稳稳; 11-13 戏剧研讨《戏剧之家》投稿…

深入浅出Netty:高性能网络应用框架的原理与实践

深入浅出Netty&#xff1a;高性能网络应用框架的原理与实践 1. Netty简介 Netty是一个基于Java的异步事件驱动的网络应用框架&#xff0c;广泛用于构建高性能、高可扩展性的网络服务器和客户端。它提供对多种协议&#xff08;如TCP、UDP、SSL等&#xff09;的支持&#xff0c;…

[SAP ABAP] 数据类型

1.基本数据类型 示例1 默认定义的基本数据类型是CHAR数据类型 输出结果: 示例2 STRING数据类型用于存储任何长度可变的字符串 输出结果: 示例3 DATE数据类型用于存储日期信息&#xff0c;并且可以存储8位数字 输出结果: 提示Tips&#xff1a;日期和时间类型的变量可以直接进…

重量级身份证明来了!政府颁发的这一证书很给力

在近日的一项重要公告中&#xff0c;北京市科学技术委员会、北京市发展和改革委员会、北京市经济和信息化局等五大部门联合公示 2023 年度第二批&#xff08;总第十九批&#xff09;北京市新技术新产品新服务名单。涛思数据旗下高性能、分布式的物联网、工业大数据平台 TDengin…

CFA官网资料说明

进入到资料后台你就会发现&#xff0c;分了三个板块&#xff0c;分别是Study, Prepare和The Exam。 Study板块 主要提供备考重要资料&#xff0c;包括教材下载、自学习系统 Prepare板块 主要帮助考生准备考试&#xff0c;提供了一些小工具、包括机考软件指南 The exam板块…

whiteboard - 笔记

1 drawio draw.io GitHub - jgraph/drawio: draw.io is a JavaScript, client-side editor for general diagramming. 2 demo 可以将XML数据保存到服务器上的data目录。需要在服务器端创建一个接收和处理POST请求的脚本,该脚本将接收到的SVG数据保存到指定的文件中。下面是…

拉依达的嵌入式学习和秋招经验

拉依达的嵌入式学习和秋招经验 你好&#xff0c;我是拉依达。目前我已经结束了自己的学生生涯&#xff0c;开启了人生的下一个阶段。 从研二准备秋招开始&#xff0c;我就逐渐将自己的学习笔记陆续整理并到CSDN上发布。起初只是作为自己学习的备份记录&#xff0c;后续得到了越…

土壤墒情自动监测站的工作原理

TH-GTS10土壤墒情自动监测站是一种现代化的农业监测设备&#xff0c;能够自动、实时地监测土壤的水分含量、温度以及其他相关参数&#xff0c;为农业生产提供科学依据。利用先进的传感器技术和远程通信技术&#xff0c;实现对土壤墒情的实时监测和数据传输。通过监测土壤的水分…

07-appium常用操作

一、press_keycode 1&#xff09;方法说明 press_keycode方法是appium的键盘相关函数&#xff0c;可以实现键盘的相关操作&#xff0c;比如返回、按键、音量调节等等。也可以使用keyevent方法&#xff0c;功能与press_keycode方法类似。 # KeyCode&#xff1a;各种操作对应的…

MEMS六轴陀螺仪工作原理介绍

MEMS&#xff08;微机电系统&#xff09;六轴陀螺仪主要包括三轴陀螺仪和三轴加速度计&#xff0c;以下是其工作原理的简要介绍&#xff1a; 三轴陀螺仪工作原理&#xff1a; 陀螺仪利用科里奥利力原理来测量角速度。它通常有一个可振动的质量…

Zookeeper基础教程

Zookeeper基础教程 资料来源&#xff1a;Zookeeper Tutorial (tutorialspoint.com) zookeeper就是Hadoop生态动物园的管理员 1. Zookeeper-概述 ZooKeeper是一种分布式协调服务&#xff0c;用于管理大型主机集群(large set of hosts)。在分布式环境中协调和管理服务是一个复…

Java实现俄罗斯方块-初始化游戏界面的JPanel

目录 技术实现&#xff1a; 2.初始化游戏界面&#xff1b; 2.1 什么是游戏界面 2.2 JPanel面板 2.3 流布局管理器【FlowLayout】 2.4 网络布局管理器 【GridLayout】 2.5 边界布局管理器 技术实现&#xff1a; 1.初始化游戏窗口&#xff1b; 2.初始化游戏界面&#xff…

解决navicat连接oracle19c数据库缺少oci.dll

下载oci.dll文件 搜索Oracle Instant Client Downloads Oracle Instant Client Downloads点击 Oracle Instant Client Downloads 超链接 根据自己的操作系统按需选择 以windows64位为例&#xff0c;下载 Version 19.23.0.0.0的OCI压缩包 解压到Navicat的安装根路径下&#xff…

基于SpringBoot校园食堂订餐管理系统

文章目录 系统运行图概要整体架构流程技术名词解释 系统运行图 概要 随着校园人口的增加和生活节奏的加快&#xff0c;校园食堂的订餐管理面临着诸多挑战&#xff0c;传统的人工点餐方式已经不能满足日益增长的需求和期望。因此&#xff0c;本论文旨在设计和实现一种基于Java的…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十四)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 22 节&#xff09; P22《21.ArkUI-实现摇杆功能》 本节我们将小鱼动画案例中的按钮控制改为摇杆控制&#xff0c;用来熟悉和巩固…

面向AI时代的软件开发新范式

作为一名软件开发者&#xff0c;有幸站在了AI时代的风口浪尖。在这篇博客中&#xff0c;我将分享我的个人看法&#xff0c;一起走向AI时代软件开发新范式。 首先&#xff0c;我们要明确软件开发活动产生的各种制品&#xff0c;都是人类知识的载体&#xff0c;也是人类文明的高级…