[特殊字符] 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 After
或Scroll API
。
from
和size
用于分页,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) SearchRequest
与 SearchSourceBuilder
用途:构建复杂查询(分页、排序、聚合)。
- 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
绑定查询条件并指定索引范围
三、最佳实践
-
性能优化
- 使用
BulkProcessor
自动分批次提交文档。 - 设置
setRefreshPolicy(WriteRequest.RefreshPolicy.NONE)
减少实时刷新开销。
- 使用
-
错误处理
try {client.index(request, RequestOptions.DEFAULT); } catch (ElasticsearchException e) {if (e.status() == RestStatus.CONFLICT) {// 处理版本冲突} }
-
版本迁移
- Elasticsearch 8.x 推荐使用新客户端
ElasticsearchClient
,语法更简洁:client.search(s -> s.index("products").query(q -> q.match(m -> m.field("name").query("iPhone"))) , Product.class);
- Elasticsearch 8.x 推荐使用新客户端
相关文章:
[特殊字符] Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南
🚀 Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南 一、HTTP API 定义与用途 Elasticsearch 的 HTTP API 是基于 RESTful 接口设计的核心交互方式,支持通过 URL 和 JSON 数据直接操作索引、文档、集群等资源。适用于快速调试、…...
网络和操作系统基础篇
网络和操作系统基础篇 TCP三次握手 客户端——发送带有SYN标志的数据包——服务端一次握手Client进入syn_sent状态;服务端——发送带有SYN/ACK标志的数据包——客户端二次握手服务端进入syn_rcvd;客户端——发送带有ACK标志的数据包——服务端三次握手…...

Oracle 连接报错:“ORA-12541:TNS:no listener ”,服务组件中找不到监听服务
一、 报错: navicat连接数据库报错:ORA-12541:TNS:no listener 二、排查问题 三、 解决问题 删除Oracle安装目录下选中的配置:listener.ora 及 listener*.bak相关的 cmd,用管理员打开 执行:netca 命…...

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

基于Flask的租房信息可视化系统的设计与实现
【Flask】基于Flask的租房信息可视化系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网的快速发展,租房市场日益繁荣,信息量急剧增加ÿ…...
《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 为大语言模型长文本处理提效论文速读
前言 在自然语言处理领域,随着大语言模型(LLMs)不断拓展其阅读、理解和生成文本的能力,如何高效处理长文本成为一项关键挑战。近日,Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混…...

【Python量化金融实战】-第1章:Python量化金融概述:1.2 Python在量化金融中的优势与生态
本小节学习建议:Python在量化金融领域的统治地位不仅体现在当前的技术栈中,更在于其持续进化的能力。随着AI、区块链等新技术的融合,Python开发者将始终处于金融创新的最前沿。建议学习者从构建完整的策略生产线开始,逐步深入高频…...

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浏览器将书签栏顶部显示
追求效果,感觉有点丑,但总归方便多了 操作路径:设置-外观-显示收藏夹栏-始终...
AIGC-Stable Diffusion模型介绍
Stable Diffusion模型介绍 Stable Diffusion模型介绍模型架构Stable Diffusion模型特点 模型原理扩散过程 代码示例 Stable Diffusion模型介绍 Stable Diffusion是一种基于深度学习的图像生成模型,特别适用于生成高质量的图像。它利用扩散模型(diffusio…...

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

科普:Docker run的相关事项
一、镜像名(含标签)太长 如,通过如下命令行: docker pull designthru2019/dify:56c6d1af0944dbdb5e0115cb623ff0e118a4ac62拉取的镜像名(及标签)太长,可以通过改名的方法变短。 在 Docker 中&…...

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

Python游戏编程之赛车游戏6-2
3.2 move()方法的定义 Player类的move()方法用于玩家控制汽车左右移动,当玩家点击键盘上的左右按键时,汽车会相应地进行左右移动。 move()方法的代码如图7所示。 图7 move()方法的代码 其中,第20行代码通过pygame.key.get_pressed()函数获…...

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

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

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

谷歌浏览器更新后导致的刷新数据无法显示
这几天突然出现的问题,就是我做了一个网站,一直用Google展示,前两天突然就是刷新会丢失数据,然后再刷新几次吧又有了,之前一直好好的,后端也做了一些配置添加了CrossOrigin注解,然而换了edge浏览…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: 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协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...

今日行情明日机会——20250609
上证指数放量上涨,接近3400点,个股涨多跌少。 深证放量上涨,但有个小上影线,相对上证走势更弱。 2025年6月9日涨停股主要行业方向分析(基于最新图片数据) 1. 医药(11家涨停) 代表标…...

vue3 手动封装城市三级联动
要做的功能 示意图是这样的,因为后端给的数据结构 不足以使用ant-design组件 的联动查询组件 所以只能自己分装 组件 当然 这个数据后端给的不一样的情况下 可能组件内对应的 逻辑方式就不一样 毕竟是 三个 数组 省份 城市 区域 我直接粘贴组件代码了 <temp…...
SE(Secure Element)加密芯片与MCU协同工作的典型流程
以下是SE(Secure Element)加密芯片与MCU协同工作的典型流程,综合安全认证、数据保护及防篡改机制: 一、基础认证流程(参数保护方案) 密钥预置 SE芯片与MCU分别预置相同的3DES密钥(Key1、Key2…...