【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 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:
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客户端已关闭!");}}@Testpublic void testClient() throws Exception {getClient();close();}
}
运行testClient后效果:
这里我们就创建好RestClient的客户端对象了,可以用该对象进行各种查询。
二、实现查询
我们通过match查询来演示下基本的API。我们新建一个MatchQueryExample.java类。其中需要使用到一下几个依赖类:
●SearchRequest: 用于构建搜索请求(指定索引名、查询条件等)。
●SearchResponse: 封装搜索结果的响应对象。
●RequestOptions: 请求配置(这里使用默认配置 DEFAULT)。
●RestHighLevelClient: Elasticsearch 的高级客户端,用于发送请求。
●QueryBuilders: 工具类,提供各种查询构建器(如 matchQuery)。
●SearchSourceBuilder: 用于构建搜索的查询条件、分页、排序等。
实现代码如下:
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如下的查询语句:
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