当前位置: 首页 > news >正文

【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

http://www.lryc.cn/news/615702.html

相关文章:

  • Lua的数组、迭代器、table、模块
  • 黑马SpringBoot+Elasticsearch作业2实战:商品搜索与竞价排名功能实现
  • sqli-labs-master/Less-51~Less-61
  • Lua语言变量、函数、运算符、循环
  • 【RocketMQ 生产者和消费者】- ConsumeMessageOrderlyService 顺序消费消息
  • 在windows安装colmap并在cmd调用
  • vue3前端项目cursor rule
  • 常用hook钩子函数
  • 海关 瑞数 失信企业 逆向 分析 后缀 rs
  • 从神经网络语言模型(NNLM)到Word2Vec:自然语言处理中的词向量学习
  • 【Html网页模板】炫酷科技风公司首页
  • Axure设计下的智慧社区数据可视化大屏:科技赋能社区管理
  • [0CTF 2016]piapiapia
  • PhotoDirector 安卓版:功能强大的照片编辑与美化应用
  • Dify集成 Echarts 实现智能数据报表集成与展示实战详解
  • 复杂项目即时通讯从android 5升级android x后遗症之解决 ANR: Input dispatching timed out 问题 -优雅草卓伊凡
  • 咪咕MGV3200-KLH_GK6323V100C_板号E503744_安卓9_短接强刷包-可救砖
  • WebAssembly技术详解:从浏览器到云原生的高性能革命
  • Flutter 与 Android NDK 集成实战:实现高性能原生功能
  • Vue3 组件化开发
  • Solana上Launchpad混战:新颖性应被重视
  • 一个“加锁无效“的诡异现象
  • BGP 笔记
  • Python 中的 Mixin
  • 第4章 程序段的反复执行2 while语句P128练习题(题及答案)
  • 【动态数据源】⭐️@DS注解实现项目中多数据源的配置
  • Datawhale AI夏令营第三期,多模态RAG方向 Task2
  • 深度学习入门Day8:生成模型革命——从GAN到扩散模型
  • pytorch llm 计算flops和参数量
  • Busybox编译、制作initramfs,并在QEMU中运行