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

文章目录

  • 前言
  • 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学习笔记

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

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

相关文章

【大数据】—“西游记“全集文本数据挖掘分析实战教程

项目背景介绍 四大名著&#xff0c;又称四大小说&#xff0c;是汉语文学中经典作品。这四部著作历久不衰&#xff0c;其中的故事、场景&#xff0c;已经深深地影响了国人的思想观念、价值取向。四部著作都有很高的艺术水平&#xff0c;细致的刻画和所蕴含的思想都为历代读者所…

XGBOOST案例

最近我在Kaggle上找到一个跟XGBOOST相关的代码&#xff0c;这有助于我们去实战性的学习。 这段代码旨在使用XGBoost和TPU进行大规模的分子绑定预测。 比赛项目&#xff1a;NeurIPS 2024 - Predict New Medicines with BELKA | Kaggle 训练样本代码&#xff1a; 上图是我们已…

新火种AI|英伟达市值超越微软!AI技术如何重塑科技股价值?

作者&#xff1a;一号 编辑&#xff1a;美美 AI&#xff0c;正带着美股狂奔。 2024年&#xff0c;英伟达&#xff08;NVIDIA&#xff09;以其在人工智能&#xff08;AI&#xff09;领域的卓越表现&#xff0c;市值首次超越了科技巨头微软&#xff0c;成为全球市值最高的公司…

如何优雅的使用Github Action服务来将Hexo部署到Github Pages

文章目录 参考文章前提条件1. 初始化Hexo2. 初始化仓库3. 创建Token4. 修改_config.yml5. 配置Github Action工作流6. 推送验证7. 配置Github Pages8. 修改Hexo主题样式10. 添加文章遇到了一些问题和方案1. 网站没有样式问题2. 图片不显示 参考文章 Bilibili视频教程-9分钟零成…

Cocos引擎加密方案解析

据2023年数据显示&#xff0c;Cocos引擎全球游戏市场的占有率约为20%&#xff0c;国内手游占有率约为40%&#xff0c;在国内手游市场中&#xff0c;不少热门游戏均为Cocos引擎研发&#xff0c;如《捕鱼达人》、《梦幻西游》、《剑与远征》等。 而在近年来国内火热的小游戏赛道…

XGBoost算法详解

XGBoost算法详解 XGBoost&#xff08;Extreme Gradient Boosting&#xff09;是一种高效的梯度提升决策树&#xff08;GBDT&#xff09;实现&#xff0c;因其高性能和灵活性在机器学习竞赛中广泛使用。本文将详细介绍XGBoost算法的原理&#xff0c;并展示其在实际数据集上的应…

IO-LiNK简介

什么是IO-Link&#xff1f; IO-Link&#xff08; IEC 61131-9 &#xff09;是一种开放式标准串行通信协议&#xff0c;允许支持 IO-Link 的传感器、设备进行双向数据交换&#xff0c;并连接到主站。 IO-Link 主站可以通过各种网络&#xff0c;如现场总线进行传输。每个 IO-L…

北方高温来袭!动力煤却不涨反跌的原因分析

内容提要 北方高温而南方降雨偏多的格局或将继续&#xff0c;整体水力发电量增长可能继续明显增长&#xff0c;但火电增幅可能继续缩小。5月重点火电厂的发电量和耗煤量增速均呈现负增长&#xff0c;耗煤量月度同比下降7%&#xff0c;而重点水电同比大增近40%。我国电力行业绿…

蓝牙模块在智能城市构建中的创新应用

随着科技的飞速发展&#xff0c;智能城市的概念已经逐渐从理论走向实践。物联网技术作为智能城市构建的核心驱动力&#xff0c;正在推动着城市基础设施、交通管理、环境监测等领域的深刻变革。蓝牙模块&#xff0c;作为物联网技术的重要组成部分&#xff0c;以其低功耗、低成本…

档案数字化建设要点

目前&#xff0c;档案信息数字化的现状是档案标准化、规范化滞后和应用软件多乱&#xff0c;这些都严重影响了系统整体水平的提高。档案信息自动化的内涵包括档案工作的各个方面和各个环节&#xff0c;其中首要的是档案业务要规范&#xff0c;档案标准要建立健全和真正实施。档…

springboot弘德图书馆座位预约管理系统-计算机毕业设计源码07028

摘 要 在面对当今培育人才计划的压力&#xff0c;人们需要汲取更多的不同领域的知识来不断扩充自己的知识层面&#xff0c;因此他们对学习的欲望不断扩大&#xff0c;图书馆作为我们的学习宝地&#xff0c;有着不可替代的地位。但是在信息化时代&#xff0c;传统模式下的图书馆…

MySql 各种 join

MySql 定义了很多join的方式&#xff0c;接下来我们用一个例子来讲解。 用到的表 本文用到了两个表s1,s2&#xff1a; 内外连接 测试 1 1 1.select * from s1 inner join s2 on(s1.id s2.id);&#xff1a; -------- | id | id | -------- | 3 | 3 | | 4 | 4 | --------2…

MySQL数据库进阶笔记

第一章 存储引擎 1.1 MySQL体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似连接处理、授权认证、及相关的安全方案。服务器也为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查…

靠这套车载测试面试题系列成功哪些20k!

HFP测试内容与测试方法 2.3 接听来电&#xff1a;测试手机来电时&#xff0c;能否从车载蓝牙设备和手机侧正常接听】拒接、通话是否正常。 1、预置条件&#xff1a;待测手机与车载车载设备处于连接状态 2、测试步骤&#xff1a; 1&#xff09;用辅助测试机拨打待测手机&…

电商还存在错位竞争空间吗?

“上链接试了&#xff0c;十几分钟&#xff0c;成本5块的东西卖1块5了。”今年618前期&#xff0c;某个电商平台上线了自动跟价功能&#xff0c;有一个卖家尝试了一会儿之后赶紧关了。 又一个618&#xff0c;平台、商家、消费者们又迎来了一次狂欢。只是与往年不同的是&#x…

2024年,收付通申请开通流程

大家好&#xff0c;今天咱们来聊聊关于APP场景中开通微信收付通的一些实用小窍门。在如今的移动互联网时代&#xff0c;很多商家都选择通过APP来提供服务和产品&#xff0c;因此如何在APP中顺利集成微信收付通功能&#xff0c;让用户能够轻松完成支付&#xff0c;就显得尤为重要…

高考志愿选专业,文科生如何分析选择专业?

每到高考时节&#xff0c;学生们最关注的就是专业选择&#xff0c;以及未来职业发展问题&#xff0c;对于文科生来说&#xff0c;面对文科专业的众多选择&#xff0c;很多人都有些不知所措&#xff0c;如何选择适合自己兴趣爱好&#xff0c;又有良好就业前景的工作。从哪些方面…

每天写java到期末考试(6.20)--集合2--练习--6.20

练习1 package QM_Fx;import java.util.ArrayList;public class test{public static void main(String[] args) {//1.创建一个集合ArrayList<String> listnew ArrayList<>();//2.添加元素list.add("点赞了吗");list.add("投币了吗");list.add(…

项目六 OpenStack虚拟机实例管理

任务一 理解OpenStack计算服务 1.1 •什么是Nova • Nova是OpenStack中的计算服务项目 &#xff0c;计算虚拟机实例生命周期的所有活动都由 Nova 管理 。 • Nova 提供统一的计算资源 服务。 • Nova 需要下列 OpenStack 服务的 支持。 Keystone &#xff1a;为所有的 OpenSt…

企智汇:弱电智能化项目工程项目管理系统助力企业项目管理!

在当今数字化时代&#xff0c;弱电智能化项目的复杂性和挑战性日益增加&#xff0c;高效的项目管理变得尤为重要。企智汇弱电智能化项目工程项目管理系统凭借其业务流程化、流程数据化、数据可视化、业财一体化及成本精细化等特性&#xff0c;为项目全生命周期管理提供了全面而…