ES的RestClient相关操作

ES的RestClient相关操作

Elasticsearch使用Java操作。

本文仅介绍CURD索引库和文档!!!

Elasticsearch基础:https://blog.csdn.net/weixin_46533577/article/details/137207222

Elasticsearch Clients官网:https://www.elastic.co/guide/en/elasticsearch/client/index.html

文档相关:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/getting-started-java.html

Java环境

规定ES版本。

xml 复制代码
<properties>
    <java.version>1.8</java.version>
    <!-- elasticsearch版本控制全局 -->
    <elasticsearch.version>7.12.1</elasticsearch.version>
</properties>

ES的版本为7.12.1。

xml 复制代码
<!--FastJson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.47</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>
<!-- elasticsearch -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

初始化RestClient

在连接开始前初始化连接对象,IP地址。

在后面关闭资源。

RestClient.builder中可以添加多个连接,方便集群环境。

java 复制代码
import cn.itcast.hotel.constants.HotelConstants;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
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 java.io.IOException;

public class HotelIndexTest {
    private RestHighLevelClient client;

    @BeforeEach
    void setup() throws Exception {
        this.client = new RestHighLevelClient(RestClient.builder((
                        HttpHost.create("http://192.168.1.4:9200"))
                // 集群缓环境下可以配置多个
                // HttpHost.create("http://192.168.1.7:9200")
        ));
    }

    @AfterEach
    void teardown() throws Exception {
        this.client.close();
    }
}

初始化输出

java 复制代码
// 初始化输出
@Test
void testInit() {
    System.out.println(client);
}

索引库操作

查询索引库

控制台中

控制台中添加索引库通过以下方式进行,那么在Java中也需要模拟这种请求。

需要注意的是,索引库不允许修改,只能在索引库中添加新的字段,但是不能修改

json 复制代码
# 查询索引库
GET /bunny
Java中演示

ES遵循restfull原则,所以写几个之后大致也能猜出后面怎么写了。

java 复制代码
// 查询索引库
@Test
void getHotelIndex() throws IOException {
    // 1. 创建Request对象
    GetIndexRequest request = new GetIndexRequest("hotel");
    // 2. 查询索引库
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    // 输出是否删除
    System.out.println(exists);
}

删除索引库

控制台中
java 复制代码
# 删除索引库
DELETE /bunny
Java中演示
java 复制代码
// 删除索引库
@Test
void deleteHotelIndex() throws IOException {
    // 1. 创建Request对象
    DeleteIndexRequest request = new DeleteIndexRequest("hotel");
    // 2. 删除索引库
    client.indices().delete(request, RequestOptions.DEFAULT);
}

添加索引库

控制台中
json 复制代码
# 创建索引库
PUT /bunny
{
  "mappings": {
    "properties": {
      "info": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email": {
        "type": "keyword",
        "index": false
      },
      "name":{
        "type": "object",
        "properties": {
          "firstName":{
            "type":"keyword"
          },
          "lastName":{
            "type":"keyword"
          }
        }
      }
    }
  }
}
Java中演示

为了简单测试,将JSON直接复制了。存到变量中。

java 复制代码
// 添加索引库
@Test
void createHotelIndex() throws IOException {
    // 1. 创建Request对象
    CreateIndexRequest request = new CreateIndexRequest("hotel");
    // 2.准备请求参数,DSL语句
    request.source(HotelConstants.HOTEL_JSON, XContentType.JSON);
    // 3. 发送请求
    client.indices().create(request, RequestOptions.DEFAULT);
}

文档操作

基础结构和上面一样。

java 复制代码
import cn.itcast.hotel.constants.HotelConstants;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
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 java.io.IOException;

public class HotelIndexTest {
    private RestHighLevelClient client;

    @BeforeEach
    void setup() throws Exception {
        this.client = new RestHighLevelClient(RestClient.builder((
                        HttpHost.create("http://192.168.1.4:9200"))
                // 集群缓环境下可以配置多个
                // HttpHost.create("http://192.168.1.7:9200")
        ));
    }

    @AfterEach
    void teardown() throws Exception {
        this.client.close();
    }
}

文档添加

控制台中

修改也是这个请求。

json 复制代码
# 插入文档会导致版本增加
POST /bunny/_doc/1
{
  "info":"插入文档",
  "email":"1@gamil.com",
  "name":{
    "firstName":"舒",
    "lastName":"纹"
  }
}
Java中演示
java 复制代码
// 插入文档,记得转换成JSON对象
@Test
void testAddDocument() throws Exception {
    // 根据id查询酒店数据
    Hotel hotel = hotelService.getById(61083L);
    // 转换为文档类型,其中有经纬度转换
    HotelDoc hotelDoc = new HotelDoc(hotel);

    // 1. 准备Request对象
    IndexRequest request = new IndexRequest("hotel").id(String.valueOf(hotelDoc.getId()));
    // 2. 准备JSON文档
    request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
    // 3. 发送请求
    client.index(request, RequestOptions.DEFAULT);
}

文档查询

控制台中

/bunny/_doc/:参数为文档名称/文档id

json 复制代码
# 查询文档
GET /bunny/_doc/1
Java中演示

GetRequest中传入,文档名称和文档id。

java 复制代码
// 查询文档操作
@Test
void testGetDocuments() throws Exception {
    // 准备Request
    GetRequest request = new GetRequest("hotel", "61083");
    // 发送请求
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    // 解析响应结果
    String json = response.getSourceAsString();

    System.out.println(JSON.parseObject(json, HotelDoc.class));
}

文档更新

Java中演示

request.doc中当成键值对,两两匹配。

java 复制代码
// 更新文档
@Test
void testUpdateDocument() throws IOException {
    // 1. Request准备
    UpdateRequest request = new UpdateRequest("hotel", "61083");
    // 准备请求参数
    request.doc(
            "price", "666",
            "starName", "四钻"
    );
    // 发送请求
    client.update(request, RequestOptions.DEFAULT);
}

文档删除

控制台中

/bunny/_doc/1:文档名称/_doc/文档id

json 复制代码
# 删除文档
DELETE /bunny/_doc/1
Java中演示
java 复制代码
// 删除文档
@Test
void testDeleteDocument() throws IOException {
    // 准备Request
    DeleteRequest request = new DeleteRequest("hotel", "61083");
    // 发送请求
    client.delete(request, RequestOptions.DEFAULT);
}

批量插入文档

在实际中,文档操作有时是批量的,所以将数据库中所有数据都转成文档,这时候需要遍历,需要注意的是经纬度在ES中有单独的规则,在转换时,需要将经纬度转为字符串类型。

格式为:维度,经度,如:hotel.getLatitude() + ", " + hotel.getLongitude();

Java中演示
java 复制代码
// 批量插入文档
@Test
void testBulkRequest() throws IOException {
    BulkRequest request = new BulkRequest();
    // 批量查询
    List<Hotel> hotels = hotelService.list();
    hotels.forEach(hotel -> {
        // 转换为HotelDoc
        HotelDoc hotelDoc = new HotelDoc(hotel);
        // 创建文档的请求体
        IndexRequest source = new IndexRequest("hotel").id(hotel.getId().toString()).source(JSON.toJSONString(hotelDoc), XContentType.JSON);
        // 添加请求体
        request.add(source);
    });
    // 发送请求
    client.bulk(request, RequestOptions.DEFAULT);
}
otels.forEach(hotel -> {
        // 转换为HotelDoc
        HotelDoc hotelDoc = new HotelDoc(hotel);
        // 创建文档的请求体
        IndexRequest source = new IndexRequest("hotel").id(hotel.getId().toString()).source(JSON.toJSONString(hotelDoc), XContentType.JSON);
        // 添加请求体
        request.add(source);
    });
    // 发送请求
    client.bulk(request, RequestOptions.DEFAULT);
}
相关推荐
Data 31716 分钟前
Hive数仓操作(十七)
大数据·数据库·数据仓库·hive·hadoop
bubble小拾4 小时前
ElasticSearch高级功能详解与读写性能调优
大数据·elasticsearch·搜索引擎
ZOHO项目管理软件4 小时前
EDM平台大比拼 用户体验与营销效果双重测评
大数据
不能放弃治疗5 小时前
重生之我们在ES顶端相遇第 18 章 - Script 使用(进阶)
elasticsearch
HyperAI超神经5 小时前
Meta 首个多模态大模型一键启动!首个多针刺绣数据集上线,含超 30k 张图片
大数据·人工智能·深度学习·机器学习·语言模型·大模型·数据集
hengzhepa6 小时前
ElasticSearch备考 -- Search across cluster
学习·elasticsearch·搜索引擎·全文检索·es
Hello.Reader7 小时前
TopK算法在大数据重复数据分析中的应用与挑战
大数据·算法·数据分析
数据龙傲天7 小时前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
Elastic 中国社区官方博客7 小时前
Elasticsearch:使用 LLM 实现传统搜索自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
慕雪华年8 小时前
【WSL】wsl中ubuntu无法通过useradd添加用户
linux·ubuntu·elasticsearch