【Elasticsearch入门到落地】16、RestClient查询文档-快速入门

接上篇《15、DSL排序、分页及高亮

上一篇我们讲解了ElasticSearch的DSL搜索结果处理(排序、分页及高亮)。本篇我们开启使用Java程序实现ElasticSearch查询文档的各项功能。

经过前面的学习,我们已经可以使用DSL来实现ElasticSearch文档查询和结果处理了。

本篇我们就来学习使用Java的RestClient实现类似的功能。

一、环境准备

1.RestClient简介

之前的章节我们已经介绍过RestClient,这里估计很多童鞋都忘记了,我们再重新温故一遍。

RestClient是操作Elasticsearch的轻量级HTTP客户端,支持通过RESTful API实现索引管理、文档增删改查等操作。相比原生Transport客户端,它具有跨语言兼容和与ES版本解耦的优势。

2.创建Java工程

(1)创建新项目

打开IntelliJ IDEA,点击New Project:

选择 Maven(推荐)或 Gradle 项目类型,选择JDK版本(建议 1.8+),GroupId配置为"com.example",ArtifactId配置为"es-restclient-demo":

点击Create建项目。

3.配置 Maven 依赖

在pom.xml中添加Elasticsearch RestClient依赖:

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>es-restclient-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- Elasticsearch RestClient -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.12.1</version> <!-- 与ES服务器版本一致 -->
        </dependency>

        <!-- 日志依赖(可选) -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.36</version>
        </dependency>

        <!-- JSON处理(如需要) -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.1</version>
        </dependency>
        
        <!-- 单元测试(如需要) -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

然后运行Maven的"Reload Project"来加载新加入的依赖:

可以看到正在加载:

加载完毕后,我们可以在依赖库中看到添加的新依赖:

4.配置Elasticsearch连接

在src的com.example包下创建工具类ElasticsearchClient.java:

java 复制代码
package com.example;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.Test;

public class ElasticsearchClient {
    private static RestHighLevelClient client;

    public static RestHighLevelClient getClient() {
        if (client == null) {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("192.168.2.129", 9200, "http"))
            );
            System.out.println("client客户端对象创建成功!");
        }
        return client;
    }

    public static void close() throws Exception {
        if (client != null) {
            client.close();
            System.out.println("client客户端已关闭!");
        }
    }

    @Test
    public void testClient() throws Exception {
        getClient();
        close();
    }
}

运行testClient后效果:

这里我们就创建好RestClient的客户端对象了,可以用该对象进行各种查询。

二、实现查询

我们通过match查询来演示下基本的API。我们新建一个MatchQueryExample.java类。其中需要使用到一下几个依赖类:

●SearchRequest: 用于构建搜索请求(指定索引名、查询条件等)。

●SearchResponse: 封装搜索结果的响应对象。

●RequestOptions: 请求配置(这里使用默认配置 DEFAULT)。

●RestHighLevelClient: Elasticsearch 的高级客户端,用于发送请求。

●QueryBuilders: 工具类,提供各种查询构建器(如 matchQuery)。

●SearchSourceBuilder: 用于构建搜索的查询条件、分页、排序等。

实现代码如下:

java 复制代码
package com.example;

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;

public class MatchQueryExample {
    public static void main(String[] args) throws Exception {
        // 通过提前写好的工具类,获取 Elasticsearch 客户端
        RestHighLevelClient client = ElasticsearchClient.getClient();

        // 构建查询请求
        // 1.指定索引名
        //创建 SearchRequest 对象,并指定要查询的索引名为hotel。
        SearchRequest request = new SearchRequest("hotel");
        // 2.构建查询条件
        // SearchSourceBuilder:用于定义查询的详细参数(如查询内容、分页、排序等)。
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //构建一个匹配查询:
        //字段名:name(表示搜索 hotel 索引中的 name 字段)。
        //搜索词:"希尔顿"(匹配包含"希尔顿"的文档)。将查询条件设置到 sourceBuilder 中
        sourceBuilder.query(QueryBuilders.matchQuery("name", "希尔顿"));
        // 3.将查询条件绑定到请求
        request.source(sourceBuilder);

        // 执行查询
        // 调用 client.search() 方法发送请求:
        // 参数1:request(封装了索引名和查询条件)。
        // 参数2:RequestOptions.DEFAULT(使用默认请求配置)。
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 处理结果
        // response.getHits(): 获取所有匹配的文档(返回 SearchHits 对象)。
        SearchHits searchHits = response.getHits();
        // 获取查询的总数
        long total = searchHits.getTotalHits().value;
        // 获取查询的结果数组
        SearchHit[] hits = searchHits.getHits();
        // 遍历每个匹配的文档(SearchHit 对象)。
        for(SearchHit hit : hits){
            // hit.getSourceAsString(): 将文档的 JSON 源数据转为字符串并打印。
            String hitJson = hit.getSourceAsString();
            System.out.println(hitJson);
        }
        ElasticsearchClient.close();
    }
}

效果:

这里实现的效果如同DSL如下的查询语句:

javascript 复制代码
GET /hotel/_search
{
  "query": {
    "match": {
      "name": "希尔顿"
    }
  }
}

其中解析的hits就是原json对象中的每一个结果文档子结果:

RestAPI中其中构建查询条件的核心部分是由一个名为QueryBuilders的工具类提供的,其中包含了各种查询方法:

三.总结

使用RestClient查询ES文档的基本步骤是:

1.创建SearchRequest对象

2.准备Request.source(),也就是DSL。QueryBuilders来构建查询条件传入Request.source()的 query()方法

3.发送请求,得到结果

4.解析结果(参考JSON结果,从外到内,逐层解析)

至此RestClient查询文档的快速入门就讲解完毕了,下一篇我们来继续讲解使用RestClient进行term、range、bool查询,以及封装公用方法简化查询代码。

转载请注明出处:https://blog.csdn.net/acmman/article/details/150143489

相关推荐
Elasticsearch7 小时前
Kibana:如何使用企业微信来接收通知
elasticsearch
Elasticsearch1 天前
哈希、存储、连接:使用 ES|QL LOOKUP JOIN 的日志去重现代解决方案
elasticsearch
yangmf20402 天前
Easysearch 冷热架构实战
java·大数据·elasticsearch·搜索引擎
极限实验室2 天前
ES 调优帖:Gateway 批量写入性能优化实践
elasticsearch
wdfk_prog4 天前
实战教程:从“对象文件为空“到仓库重生——修复 Git 仓库损坏全记录
大数据·网络·笔记·git·学习·elasticsearch·全文检索
Hello.Reader4 天前
以 Eland 玩转 Elasticsearch 8.12 Learning-to-Rank
大数据·elasticsearch·jenkins
ALex_zry4 天前
Git Status 命令深度指南:洞悉仓库状态的核心艺术
大数据·git·elasticsearch
ζั͡山 ั͡有扶苏 ั͡✾4 天前
Elasticsearch 单节点迁移实战指南:从旧服务器到新环境的完整流程
服务器·elasticsearch·jenkins
ALex_zry4 天前
Git 乱码文件处理全流程指南:从识别到彻底清除
git·elasticsearch·搜索引擎