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

[特殊字符] Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南

🚀 Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南


一、HTTP API

定义与用途

Elasticsearch 的 HTTP API 是基于 RESTful 接口设计的核心交互方式,支持通过 URL 和 JSON 数据直接操作索引、文档、集群等资源。适用于快速调试、脚本调用和跨语言集成。


1. 索引管理

(1) 创建索引(指定分片与映射)
PUT /products 
{"settings": {"number_of_shards": 3,"number_of_replicas": 1},"mappings": {"properties": {"name": { "type": "text" },"price": { "type": "integer" }}}
}
  • 用途:初始化数据结构,定义字段类型和分片策略。
  • 参数说明
    • number_of_shards:主分片数(不可修改)。
    • mappings:字段类型(如 text 支持分词,keyword 精确匹配)。

product:只是一个代表,是你要创建的索引的名称,索引可以理解为mysql中的一个表
settings :配置

properties:其内容就是你要写入到es的对象具体内容

(2) 删除索引
DELETE /products
  • 风险提示:删除索引会清空所有数据,需谨慎操作。

2. 文档操作

(1) 新增文档(自动生成 ID)
POST /products/_doc
{"name": "iPhone 14","price": 6999
}
  • 响应示例:返回自动生成的 _id(如 _id: "x123")。

如上,请求体给出具体写到文档中的内容,文档可以理解为mysql中的一行数据记录

(2) 局部更新文档
POST /products/_update/x123
{"doc": { "price": 6499 }
}
  • 优势:仅更新指定字段,减少网络传输和索引重建开销。

3. 查询与聚合

(1) 条件查询(分页与排序)
GET /products/_search
{"query": {"match": { "name": "iPhone" }},"from": 0,"size": 10,"sort": [ { "price": "desc" } ]
}
  • 性能注意:深度分页(from > 10000)需改用 Search AfterScroll API

fromsize用于分页,from表示从第n个数据开始,size表示返回这个开始数据算起的m条文档数据

sort 表示按照什么字段排序,升序还是降序

(2) 聚合统计(平均值)
GET /products/_search
{"aggs": {"avg_price": { "avg": { "field": "price" } }}
}
  • 结果路径aggregations -> avg_price -> value

4. 批量操作

(1) 批量写入/删除
POST /_bulk
{ "index": { "_index": "products", "_id": "1" } }
{ "name": "iPad", "price": 3999 }
{ "delete": { "_index": "products", "_id": "2" } }
  • 性能建议:单次批量操作不超过 10MB,避免超时。

二、Java API

定义与用途

Java API 是 Elasticsearch 官方提供的高层客户端库(RestHighLevelClient),封装了 HTTP 请求的复杂性,支持强类型操作和异步处理。适用于后端服务开发。


1. RestHighLevelClient 常用方法

定义与用途

RestHighLevelClient 是 Java 客户端的入口类,通过调用其方法执行索引、文档、搜索等操作。需注意在 Elasticsearch 8.x 中已逐步迁移至新客户端 ElasticsearchClient,但旧版仍广泛使用。


(1) 索引管理方法
方法签名用途对应 Request 类
indices().create()创建索引CreateIndexRequest
indices().delete()删除索引DeleteIndexRequest
indices().exists()检查索引是否存在GetIndexRequest

示例:创建索引

CreateIndexRequest request = new CreateIndexRequest("products").settings(Settings.builder().put("number_of_shards", 3)).mapping(Map.of("properties", Map.of("name", Map.of("type", "text"))));
client.indices().create(request, RequestOptions.DEFAULT);

(2) 文档操作方法
方法签名用途对应 Request 类
index()新增/全量替换文档IndexRequest
update()局部更新文档UpdateRequest
delete()删除文档DeleteRequest

示例:局部更新文档

UpdateRequest request = new UpdateRequest("products", "x123").doc(Map.of("price", 6499));
client.update(request, RequestOptions.DEFAULT);

(3) 查询与聚合方法
方法签名用途对应 Request 类
search()执行搜索SearchRequest
scroll()滚动查询大数据量SearchScrollRequest

示例:条件查询

SearchSourceBuilder source = new SearchSourceBuilder().query(QueryBuilders.matchQuery("name", "iPhone")).size(10);
SearchRequest request = new SearchRequest("products").source(source);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);

2. Request 与 Builder 常用方法

定义与用途

每个操作对应一个 Request 类,通过 Builder 模式链式设置参数(如查询条件、分页、聚合等)。新版客户端(8.x)推荐使用流式语法(Lambda 表达式),旧版通过 XxxRequestBuilder 类构建。


(1) SearchRequestSearchSourceBuilder

用途:构建复杂查询(分页、排序、聚合)。

  • Request 方法
    • indices(String... indices):指定搜索的索引。
    • source(SearchSourceBuilder source):绑定查询条件、分页、排序等。
  • Builder 方法
    • query(QueryBuilder query):设置查询条件(如 matchQuery)。
    • aggregation(AggregationBuilder aggregation):添加聚合逻辑(如 avg)。
    • from(int).size(int):分页控制

对于QueryBuilders 的详细介绍,看这篇文章
玩转Elasticsearch 查询利器!QueryBuilders 核心方法全解析-CSDN博客

核心方法

SearchSourceBuilder source = new SearchSourceBuilder().query(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("name", "iPhone")).filter(QueryBuilders.rangeQuery("price").gte(5000))).aggregation(AggregationBuilders.avg("avg_price").field("price")).from(0).size(10);
SearchRequest request = new SearchRequest("products").source(source);

(2) BulkRequest(批量操作)

用途:混合执行增删改操作。

  • Request 方法
    • add(IndexRequest/UpdateRequest/DeleteRequest):混合添加增删改操作。
  • Builder 方法
    • setRefreshPolicy(WriteRequest.RefreshPolicy):设置刷新策略(如 IMMEDIATE 实时生效)。

示例

BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(new IndexRequest("products").id("1").source("name", "iPad"));
bulkRequest.add(new DeleteRequest("products").id("2"));
client.bulk(bulkRequest, RequestOptions.DEFAULT);

(3) UpdateByQueryRequest(按条件更新)

用途:批量更新符合查询条件的文档。

  • Request 方法
    • setQuery(QueryBuilder query):筛选目标文档。
    • setScript(Script script):定义更新逻辑。

示例

UpdateByQueryRequest request = new UpdateByQueryRequest("products");
request.setQuery(QueryBuilders.termQuery("status", "pending"));
request.setScript(new Script("ctx._source.status = 'processed'"));
client.updateByQuery(request, RequestOptions.DEFAULT);

3. 整合示例:Request 与 Builder 协作

场景:构建复杂查询(分页 + 聚合 + 高亮)
// 1. 构建查询条件
SearchSourceBuilder source = new SearchSourceBuilder().query(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("name", "iPhone")).filter(QueryBuilders.rangeQuery("price").gte(5000))).aggregation(AggregationBuilders.avg("avg_price").field("price")).highlighter(new HighlightBuilder().field("name").preTags("<em>").postTags("</em>")).from(0).size(10);// 2. 创建 Request 对象
SearchRequest request = new SearchRequest("products").source(source).indices("products", "sales"); // 跨索引查询// 3. 执行查询
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
  • 关键点
    • SearchSourceBuilder 负责组装查询逻辑。
    • SearchRequest 绑定查询条件并指定索引范围

三、最佳实践

  1. 性能优化

    • 使用 BulkProcessor 自动分批次提交文档。
    • 设置 setRefreshPolicy(WriteRequest.RefreshPolicy.NONE) 减少实时刷新开销。
  2. 错误处理

    try {client.index(request, RequestOptions.DEFAULT);
    } catch (ElasticsearchException e) {if (e.status() == RestStatus.CONFLICT) {// 处理版本冲突}
    }
    
  3. 版本迁移

    • Elasticsearch 8.x 推荐使用新客户端 ElasticsearchClient,语法更简洁:
      client.search(s -> s.index("products").query(q -> q.match(m -> m.field("name").query("iPhone")))
      , Product.class);
      

相关文章:

[特殊字符] Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南

&#x1f680; Elasticsearch 双剑合璧&#xff1a;HTTP API 与 Java API 实战整合指南 一、HTTP API 定义与用途 Elasticsearch 的 HTTP API 是基于 RESTful 接口设计的核心交互方式&#xff0c;支持通过 URL 和 JSON 数据直接操作索引、文档、集群等资源。适用于快速调试、…...

网络和操作系统基础篇

网络和操作系统基础篇 TCP三次握手 客户端——发送带有SYN标志的数据包——服务端一次握手Client进入syn_sent状态&#xff1b;服务端——发送带有SYN/ACK标志的数据包——客户端二次握手服务端进入syn_rcvd&#xff1b;客户端——发送带有ACK标志的数据包——服务端三次握手…...

Oracle 连接报错:“ORA-12541:TNS:no listener ”,服务组件中找不到监听服务

一、 报错&#xff1a; navicat连接数据库报错&#xff1a;ORA-12541&#xff1a;TNS:no listener 二、排查问题 三、 解决问题 删除Oracle安装目录下选中的配置&#xff1a;listener.ora 及 listener*.bak相关的 cmd&#xff0c;用管理员打开 执行&#xff1a;netca 命…...

内外网文件传输 安全、可控、便捷的跨网数据传输方案

一、背景与痛点 在内外网隔离的企业网络环境中&#xff0c;员工与外部协作伙伴&#xff08;如钉钉用户&#xff09;的文件传输面临以下挑战&#xff1a; 安全性风险&#xff1a;内外网直连可能导致病毒传播、数据泄露。 操作繁琐&#xff1a;传统方式需频繁切换网络环境&…...

基于Flask的租房信息可视化系统的设计与实现

【Flask】基于Flask的租房信息可视化系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网的快速发展&#xff0c;租房市场日益繁荣&#xff0c;信息量急剧增加&#xff…...

《Keras 2 :使用 RetinaNet 进行对象检测》:此文为AI自动翻译

《Keras 2 :使用 RetinaNet 进行对象检测》 作者:Srihari Humbarwadi 创建日期:2020/05/17 最后修改日期:2023/07/10 描述:实施 RetinaNet:用于密集对象检测的焦点损失。 (i) 此示例使用 Keras 2 在 Colab 中查看 • 介绍 目标检测是计算机中非常重要的问题 视觉。在…...

【Erdas实验教程】010:监督分类及后处理、精度评价

文章目录 一、监督分类介绍二、监督分类流程1. 定义分类模板2. 评价分类模板3. 执行监督分类4. 评价分类结果4.1 叠加显示4.2 动态窗口链接4.3 阈值处理4.4 分类精度评价5. 分类后处理5.1 集聚处理5.2 滤网分析5.3 去除分析5.4 重编码一、监督分类介绍 遥感图像计算机分类的依…...

Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读

前言 在自然语言处理领域&#xff0c;随着大语言模型&#xff08;LLMs&#xff09;不断拓展其阅读、理解和生成文本的能力&#xff0c;如何高效处理长文本成为一项关键挑战。近日&#xff0c;Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混…...

【Python量化金融实战】-第1章:Python量化金融概述:1.2 Python在量化金融中的优势与生态

本小节学习建议&#xff1a;Python在量化金融领域的统治地位不仅体现在当前的技术栈中&#xff0c;更在于其持续进化的能力。随着AI、区块链等新技术的融合&#xff0c;Python开发者将始终处于金融创新的最前沿。建议学习者从构建完整的策略生产线开始&#xff0c;逐步深入高频…...

react路由总结

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…...

edge浏览器将书签栏顶部显示

追求效果&#xff0c;感觉有点丑&#xff0c;但总归方便多了 操作路径&#xff1a;设置-外观-显示收藏夹栏-始终...

AIGC-Stable Diffusion模型介绍

Stable Diffusion模型介绍 Stable Diffusion模型介绍模型架构Stable Diffusion模型特点 模型原理扩散过程 代码示例 Stable Diffusion模型介绍 Stable Diffusion是一种基于深度学习的图像生成模型&#xff0c;特别适用于生成高质量的图像。它利用扩散模型&#xff08;diffusio…...

【算法】游艇租贷

问题 ⻓江游艇俱乐部在⻓江上设置了 n 个游艇租聘站&#xff0c;游客可以在这些租聘站租 ⽤游艇&#xff0c;然后在下游的任何⼀个租聘站归还。游艇出租站 i 到 j 的租⾦为 r(i, j)&#xff0c;1 ≤i< j≤n&#xff0c;设计⼀个算法&#xff0c;计算从出租站 i 到 j 所需的…...

科普:Docker run的相关事项

一、镜像名&#xff08;含标签&#xff09;太长 如&#xff0c;通过如下命令行&#xff1a; docker pull designthru2019/dify:56c6d1af0944dbdb5e0115cb623ff0e118a4ac62拉取的镜像名&#xff08;及标签&#xff09;太长&#xff0c;可以通过改名的方法变短。 在 Docker 中&…...

Ryu:轻量开源,开启 SDN 新程

1. Ryu 控制器概述 定位&#xff1a;轻量级、开源的SDN控制器&#xff0c;专为开发者和研究人员设计&#xff0c;基于Python实现。开发者&#xff1a;由日本NTT实验室主导开发&#xff0c;遵循Apache 2.0开源协议。核心理念&#xff1a;简化SDN应用开发&#xff0c;提供友好的…...

Python游戏编程之赛车游戏6-2

3.2 move()方法的定义 Player类的move()方法用于玩家控制汽车左右移动&#xff0c;当玩家点击键盘上的左右按键时&#xff0c;汽车会相应地进行左右移动。 move()方法的代码如图7所示。 图7 move()方法的代码 其中&#xff0c;第20行代码通过pygame.key.get_pressed()函数获…...

IDEA + 通义灵码AI程序员:快速构建DDD后端工程模板

作者&#xff1a;陈荣健 IDEA 通义灵码AI程序员&#xff1a;快速构建DDD后端工程模板 在软件开发过程中&#xff0c;一个清晰、可维护、可扩展的架构至关重要。领域驱动设计 (DDD) 是一种软件开发方法&#xff0c;它强调将软件模型与业务领域紧密结合&#xff0c;从而构建更…...

libwebsockets交叉编译全流程

libwebsocket中的webscoket加密功能需要依赖于Openssl库因此需要提前准备好openssl开源库。 交叉编译openssl 下面演示源码方式交叉编译OpenSSL为动态库。 创建个Websocket文件夹&#xff0c;把后续的成果物均放在这个文件中&#xff0c;文件夹中创建子文件夹OpenSSL和libWeb…...

蓝思科技赋能灵伴科技:AI眼镜产能与供应链双升级

2月22日&#xff0c;蓝思科技宣布与AI交互领军企业杭州灵伴科技&#xff08;Rokid&#xff09;达成深度战略合作&#xff0c;通过整机组装与全产业链整合&#xff0c;为2025年全球AI眼镜出货量爆发式增长&#xff08;预计达400万-1200万台&#xff09;提供核心支撑。 双方合作通…...

谷歌浏览器更新后导致的刷新数据无法显示

这几天突然出现的问题&#xff0c;就是我做了一个网站&#xff0c;一直用Google展示&#xff0c;前两天突然就是刷新会丢失数据&#xff0c;然后再刷新几次吧又有了&#xff0c;之前一直好好的&#xff0c;后端也做了一些配置添加了CrossOrigin注解&#xff0c;然而换了edge浏览…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...

今日行情明日机会——20250609

上证指数放量上涨&#xff0c;接近3400点&#xff0c;个股涨多跌少。 深证放量上涨&#xff0c;但有个小上影线&#xff0c;相对上证走势更弱。 2025年6月9日涨停股主要行业方向分析&#xff08;基于最新图片数据&#xff09; 1. 医药&#xff08;11家涨停&#xff09; 代表标…...

vue3 手动封装城市三级联动

要做的功能 示意图是这样的&#xff0c;因为后端给的数据结构 不足以使用ant-design组件 的联动查询组件 所以只能自己分装 组件 当然 这个数据后端给的不一样的情况下 可能组件内对应的 逻辑方式就不一样 毕竟是 三个 数组 省份 城市 区域 我直接粘贴组件代码了 <temp…...

SE(Secure Element)加密芯片与MCU协同工作的典型流程

以下是SE&#xff08;Secure Element&#xff09;加密芯片与MCU协同工作的典型流程&#xff0c;综合安全认证、数据保护及防篡改机制&#xff1a; 一、基础认证流程&#xff08;参数保护方案&#xff09; 密钥预置‌ SE芯片与MCU分别预置相同的3DES密钥&#xff08;Key1、Key2…...