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

RestClient

  1. 什么是RestClient

    RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。

    RestClient 主要特点

    • 轻量级:只负责 HTTP 通信,不包含高级功能

    • 兼容性好:支持所有 Elasticsearch 版本

    • 灵活性强:可以自定义请求和响应处理

    • 线程安全:可以被多线程共享使用

    • 性能优秀:内置连接池和失败重试机制

    ES中支持两种地理坐标数据类型: geo_point:由纬度(latitude)和经度(longitude)确定的一个点。

    例如:"32.8752345,120.2981576 geo_shape:有多个geo_point组成的复杂几何图形。例如一条直线 "LINESTRING(-77.03653 38.897676,-77.009051 38.889939)

    字段拷贝可以使用copy_to属性将当前字段拷贝到指定字段。用来解决多个搜索字段共同搜索时的效率问题示例:

    "all":{
    "type":"text",
    "analyzer":"ik_max_word"
    },
    "brand":{
    "type":"keyword",
    "copy_to":"all"
    }
  1. 初始化RestClient

    创建ElasticsearchUtil.java 工具类:

    import org.apache.http.HttpHost;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestClientBuilder;
    import org.elasticsearch.client.RestHighLevelClient;
    ​
    public class ElasticsearchUtil {private static RestHighLevelClient client;public static void init() {// 配置ES集群地址,可以配置多个RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http")// 可以添加更多节点// new HttpHost("localhost", 9201, "http"));// 可选:配置连接超时、认证等builder.setRequestConfigCallback(requestConfigBuilder -> {return requestConfigBuilder.setConnectTimeout(5000)    // 连接超时时间.setSocketTimeout(60000);  // 套接字超时时间});client = new RestHighLevelClient(builder);}public static RestHighLevelClient getClient() {if (client == null) {init();}return client;}public static void close() {if (client != null) {try {client.close();} catch (Exception e) {e.printStackTrace();}}}
    }

    创建索引的操作

    import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
    import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
    import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.xcontent.XContentType;
    ​
    import java.io.IOException;
    ​
    public class IndexOperations {private static final String INDEX_NAME = "products";public static void main(String[] args) throws IOException {RestHighLevelClient client = ElasticsearchUtil.getClient();// 创建索引createIndex(client);// 检查索引是否存在boolean exists = checkIndexExists(client);System.out.println("索引是否存在: " + exists);// 删除索引// deleteIndex(client);ElasticsearchUtil.close();}public static void createIndex(RestHighLevelClient client) throws IOException {CreateIndexRequest request = new CreateIndexRequest(INDEX_NAME);// 索引设置request.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 1));// 映射定义String mapping = "{\n" +"  \"properties\": {\n" +"    \"id\": {\"type\": \"keyword\"},\n" +"    \"name\": {\n" +"      \"type\": \"text\",\n" +"      \"analyzer\": \"ik_max_word\",\n" +"      \"fields\": {\"keyword\": {\"type\": \"keyword\"}}\n" +"    },\n" +"    \"price\": {\"type\": \"double\"},\n" +"    \"stock\": {\"type\": \"integer\"},\n" +"    \"create_time\": {\"type\": \"date\"}\n" +"  }\n" +"}";request.mapping("_doc", mapping, XContentType.JSON);client.indices().create(request, RequestOptions.DEFAULT);System.out.println("索引创建成功");}public static boolean checkIndexExists(RestHighLevelClient client) throws IOException {GetIndexRequest request = new GetIndexRequest();request.indices(INDEX_NAME);return client.indices().exists(request, RequestOptions.DEFAULT);}public static void deleteIndex(RestHighLevelClient client) throws IOException {DeleteIndexRequest request = new DeleteIndexRequest(INDEX_NAME);client.indices().delete(request, RequestOptions.DEFAULT);System.out.println("索引删除成功");}
    }

文档CRUD操作

import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
​
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
​
public class DocumentOperations {private static final String INDEX_NAME = "products";private static final ObjectMapper mapper = new ObjectMapper();public static void main(String[] args) throws IOException {RestHighLevelClient client = ElasticsearchUtil.getClient();// 添加文档String docId = createDocument(client);// 查询文档getDocument(client, docId);// 更新文档updateDocument(client, docId);// 删除文档// deleteDocument(client, docId);ElasticsearchUtil.close();}public static String createDocument(RestHighLevelClient client) throws IOException {// 准备文档数据Map<String, Object> document = new HashMap<>();document.put("id", "1001");document.put("name", "华为手机 P40");document.put("price", 4999.00);document.put("stock", 100);document.put("create_time", new Date());// 创建索引请求IndexRequest request = new IndexRequest(INDEX_NAME).id(document.get("id").toString())  // 文档ID.source(mapper.writeValueAsString(document), XContentType.JSON);// 执行请求IndexResponse response = client.index(request, RequestOptions.DEFAULT);if (response.getResult() == DocWriteResponse.Result.CREATED) {System.out.println("文档创建成功, ID: " + response.getId());} else if (response.getResult() == DocWriteResponse.Result.UPDATED) {System.out.println("文档更新成功, ID: " + response.getId());}return response.getId();}public static void getDocument(RestHighLevelClient client, String docId) throws IOException {GetRequest request = new GetRequest(INDEX_NAME, docId);GetResponse response = client.get(request, RequestOptions.DEFAULT);if (response.isExists()) {System.out.println("获取文档成功: " + response.getSourceAsString());} else {System.out.println("文档不存在");}}public static void updateDocument(RestHighLevelClient client, String docId) throws IOException {// 准备更新内容Map<String, Object> updateFields = new HashMap<>();updateFields.put("price", 4599.00);updateFields.put("stock", 80);UpdateRequest request = new UpdateRequest(INDEX_NAME, docId).doc(mapper.writeValueAsString(updateFields), XContentType.JSON);UpdateResponse response = client.update(request, RequestOptions.DEFAULT);System.out.println("文档更新成功, 版本号: " + response.getVersion());}public static void deleteDocument(RestHighLevelClient client, String docId) throws IOException {DeleteRequest request = new DeleteRequest(INDEX_NAME, docId);DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);if (response.getResult() == DocWriteResponse.Result.DELETED) {System.out.println("文档删除成功");} else if (response.getResult() == DocWriteResponse.Result.NOT_FOUND) {System.out.println("文档不存在");}}
}

搜索操作:重点在于如何构建查询的条件

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.builder.SearchSourceBuilder;
​
import java.io.IOException;
​
public class SearchOperations {private static final String INDEX_NAME = "products";public static void main(String[] args) throws IOException {RestHighLevelClient client = ElasticsearchUtil.getClient();// 简单匹配查询searchByMatch(client);// 范围查询// searchByRange(client);ElasticsearchUtil.close();}public static void searchByMatch(RestHighLevelClient client) throws IOException {SearchRequest request = new SearchRequest(INDEX_NAME);// 构建查询条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.matchQuery("name", "华为手机"));// 设置分页sourceBuilder.from(0);sourceBuilder.size(10);request.source(sourceBuilder);// 执行查询SearchResponse response = client.search(request, RequestOptions.DEFAULT);System.out.println("命中总数: " + response.getHits().getTotalHits().value);System.out.println("查询耗时(ms): " + response.getTook().getMillis());for (SearchHit hit : response.getHits().getHits()) {System.out.println("文档ID: " + hit.getId() + ", 内容: " + hit.getSourceAsString());}}public static void searchByRange(RestHighLevelClient client) throws IOException {SearchRequest request = new SearchRequest(INDEX_NAME);SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.rangeQuery("price").gte(4000).lte(5000));request.source(sourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);System.out.println("价格在4000-5000之间的商品:");for (SearchHit hit : response.getHits().getHits()) {System.out.println(hit.getSourceAsString());}}
}

批量进行操作

import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
​
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
​
public class BulkOperations {private static final String INDEX_NAME = "products";public static void main(String[] args) throws IOException {RestHighLevelClient client = ElasticsearchUtil.getClient();// 准备批量数据List<String> products = Arrays.asList("{\"id\":\"1002\",\"name\":\"小米手机10\",\"price\":3999.00,\"stock\":50}","{\"id\":\"1003\",\"name\":\"iPhone 12\",\"price\":6299.00,\"stock\":30}","{\"id\":\"1004\",\"name\":\"OPPO Find X2\",\"price\":4999.00,\"stock\":40}");BulkRequest request = new BulkRequest();// 添加多个操作到批量请求for (String product : products) {String id = extractId(product); // 从JSON中提取IDrequest.add(new IndexRequest(INDEX_NAME).id(id).source(product, XContentType.JSON));}// 执行批量操作BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);if (response.hasFailures()) {System.out.println("批量操作有部分失败: " + response.buildFailureMessage());} else {System.out.println("批量操作全部成功");}ElasticsearchUtil.close();}private static String extractId(String json) {// 简单实现,实际应用中应该使用JSON解析return json.split("\"id\":\"")[1].split("\"")[0];}
}

RestClient 提供了灵活而强大的方式来与 Elasticsearch 交互,虽然需要编写更多代码,但也提供了更精细的控制能力。对于大多数 Java 应用程序来说,这是与 Elasticsearch 集成的可靠选择。

相关文章:

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...