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

【用 Java API Client 操作 Elasticsearch】

🚀 一篇搞懂:用 Java API Client 操作 Elasticsearch(超详细 + 通俗易懂)

大家好,这篇文章我们来从0开始讲清楚:如何用Java API Client操作 Elasticsearch。

一、什么是 Java API Client?

在 Elasticsearch 8.x 之后,官方推荐使用:

👉Java API Client(co.elastic.clients)

替代旧的:

  • RestHighLevelClient(已经被废弃)

它的特点是:

  • ✅ 类型安全(强类型,不再是字符串拼JSON)
  • ✅ API更现代
  • ✅ 和ES版本强绑定

二、环境准备

1️⃣ Maven 依赖

<dependencies><!-- Elasticsearch Java API Client --><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.12.0</version></dependency><!-- 低级客户端 --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>8.12.0</version></dependency><!-- JSON 处理 --><dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>2.0.1</version></dependency></dependencies>

2️⃣ 创建客户端

这是所有操作的基础,必须掌握。

RestClientrestClient=RestClient.builder(newHttpHost("localhost",9200)).build();ElasticsearchTransporttransport=newRestClientTransport(restClient,newJacksonJsonpMapper());ElasticsearchClientclient=newElasticsearchClient(transport);

👉 一句话理解:

  • RestClient:负责HTTP通信
  • Transport:负责数据转换
  • Client:我们真正用的API

三、索引操作(Index)

1️⃣ 创建索引

client.indices().create(c->c.index("user_index"));

2️⃣ 删除索引

client.indices().delete(d->d.index("user_index"));

3️⃣ 判断索引是否存在

Booleanexists=client.indices().exists(e->e.index("user_index")).value();System.out.println(exists);

四、文档操作(CRUD)

我们定义一个实体类:

classUser{publicStringname;publicintage;}

1️⃣ 插入文档(Create)

Useruser=newUser();user.name="张三";user.age=20;client.index(i->i.index("user_index").id("1").document(user));

2️⃣ 查询文档(Read)

GetResponse<User>response=client.get(g->g.index("user_index").id("1"),User.class);Useruser=response.source();System.out.println(user.name);

3️⃣ 更新文档(Update)

client.update(u->u.index("user_index").id("1").doc(newUser(){{age=25;}}),User.class);

4️⃣ 删除文档(Delete)

client.delete(d->d.index("user_index").id("1"));

五、查询操作(重点🔥)

1️⃣ match 查询(全文检索)

SearchResponse<User>response=client.search(s->s.index("user_index").query(q->q.match(m->m.field("name").query("张三"))),User.class);

2️⃣ term 查询(精确匹配)

.query(q->q.term(t->t.field("age").value(25)))

3️⃣ 范围查询(range)

.query(q->q.range(r->r.field("age").gte(JsonData.of(20)).lte(JsonData.of(30))))

4️⃣ bool 查询(组合查询)

.query(q->q.bool(b->b.must(m->m.match(mm->mm.field("name").query("张三"))).filter(f->f.range(r->r.field("age").gte(JsonData.of(20))))))

👉 理解:

  • must:必须满足(参与评分)
  • filter:过滤(不参与评分,更快)

5️⃣ 解析结果

for(Hit<User>hit:response.hits().hits()){Useruser=hit.source();System.out.println(user.name+" "+user.age);}

六、分页查询

SearchResponse<User>response=client.search(s->s.index("user_index").from(0)// 起始位置.size(10)// 每页数量.query(q->q.match(m->m.field("name").query("张三"))),User.class);

七、排序

.sort(s->s.field(f->f.field("age").order(SortOrder.Desc)))

八、一个完整小案例(推荐直接跑🔥)

publicstaticvoidmain(String[]args)throwsException{ElasticsearchClientclient=createClient();// 1. 创建索引client.indices().create(c->c.index("user_index"));// 2. 插入数据Useruser=newUser();user.name="李四";user.age=30;client.index(i->i.index("user_index").id("1").document(user));// 3. 查询SearchResponse<User>response=client.search(s->s.index("user_index").query(q->q.match(m->m.field("name").query("李四"))),User.class);// 4. 输出for(Hit<User>hit:response.hits().hits()){System.out.println(hit.source().name);}}

九、常见坑(一定要看⚠️)

❌ 1. 版本不一致

  • Java Client 和 ES 服务端版本必须接近

❌ 2. 字段类型问题

  • text → 不能 term 查询
  • keyword → 才能精确匹配

❌ 3. JSON 转换问题

  • 推荐使用 JacksonJsonpMapper

❌ 4. 中文查询问题

  • 需要分词器(ik分词器等)

十、总结

一句话总结:

👉 Java API Client =更安全、更优雅的ES操作方式

http://www.cnnetsun.cn/news/1343566.html

相关文章:

  • AI智能体中的Skills是什么?
  • 某厂Java面试实录:深度解析高并发秒杀系统、Redis原子扣减、分布式锁与消息可靠性
  • Pandas加载Avro文件
  • sdut-程序设计基础Ⅰ-23级转专业第一次机测题
  • python运算符
  • 深入理解 AI Agent 中的 Skills:让 AI 拥有专业能力的秘密武器
  • 深度解析 pprof 的采样机制:它是如何在不影响性能的前提下捕获堆栈快照的?
  • 密码学加解密实训(Base64转义)
  • python股票数据分析预测系统 大模型股票行情预测系统 量化交易分析预测系统
  • Linux系统
  • 腾讯版「龙虾」Workbuddy上线当天,我用它搭了一套行业情报日报系统
  • 图表替代文字降AI率不会?看完这篇5分钟学会
  • AI Image Background Remover Pro
  • Python绘制带自动缩放的线条、多边形和规则多边形集合图
  • java面试题总结2
  • 老周虾扯:解构 AI 记忆构建长效 Agent 的底层逻辑与认知体系
  • 大数据建模中的混沌工程:测试系统弹性的方法
  • 深入解析UniAD架构:面向决策规划的端到端自动驾驶Transformer模型全景报告
  • C/C++: 栈包含哪些数据信息
  • 加解密篇 - 非对称加密算法 (RSA、DSA、ECC、DH)
  • 如何使用SQuAD Explorer:探索自然语言理解的终极指南
  • 探索稳定扩散之卓越:Awesome Stable Diffusion
  • 【亲测免费】 WunderGraph 开源项目教程
  • 开源项目 `path` 使用教程
  • 开源项目推荐:Polyfill Library
  • TrackEval:终极多目标跟踪评估工具,HOTA指标轻松掌握!
  • 如何用uni-api快速搭建个人AI服务:5分钟配置多模型负载均衡指南
  • Hyperledger Fabric交易流程详解:从提案到共识的完整生命周期
  • URLImage vs AsyncImage:为什么选择轻量级SwiftUI图片加载库?
  • 从0到1:用FontBlaster构建支持多字体的iOS应用案例