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

news/2025/2/24 7:10:39
http://www.w3.org/2000/svg" style="display: none;">

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


一、HTTP API

定义与用途

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


1. 索引管理

(1) 创建索引(指定分片与映射)
http">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) 删除索引
http">DELETE /products
  • 风险提示:删除索引会清空所有数据,需谨慎操作。

2. 文档操作

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

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

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

3. 查询与聚合

(1) 条件查询(分页与排序)
http">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) 聚合统计(平均值)
http">GET /products/_search
{
  "aggs": {
    "avg_price": { "avg": { "field": "price" } }
  }
}
  • 结果路径aggregations -> avg_price -> value

4. 批量操作

(1) 批量写入/删除
http">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

示例:创建索引

java">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

示例:局部更新文档

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

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

示例:条件查询

java">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博客

核心方法

java">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 实时生效)。

示例

java">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):定义更新逻辑。

示例

java">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 协作

场景:构建复杂查询(分页 + 聚合 + 高亮)
java">// 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. 错误处理

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

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

http://www.niftyadmin.cn/n/5864065.html

相关文章

前端VUE3框架的快速搭建

前端VUE3框架的快速搭建 安装nodejs创建一个 Vue 应用精简VUE项目在idea中运行vue项目修改标题定义全局css样式404页面 安装nodejs 参考&#xff1a;在MAC上面通过HomeBrew安装node和npm指定版本 https://blog.csdn.net/yu_fu_a_bu/article/details/145810229 vue3推荐使用 n…

基于 Python 的项目管理系统开发

基于 Python 的项目管理系统开发 一、引言 在当今快节奏的工作环境中&#xff0c;有效的项目管理对于项目的成功至关重要。借助信息技术手段开发项目管理系统&#xff0c;能够显著提升项目管理的效率和质量。Python 作为一种功能强大、易于学习且具有丰富库支持的编程语言&…

【行业解决方案十九】【DeepSeek汽车制造:焊接质量检测方案 】

在汽车制造领域,焊接质量直接关系到产品的安全性和可靠性。传统焊接检测方法不仅效率低下,还难以实现全面监控和质量问题的精准溯源。而如今,借助人工智能和大数据技术,DeepSeek 提供了一套全新的焊接质量检测方案,彻底改变了这一局面。 一、为什么焊接质量检测如此重要?…

通俗理解什么是云原生?

by deepseek。 一、核心理念&#xff1a;云原生到底是什么&#xff1f; 1. 一句话定义 云原生&#xff08;Cloud Native&#xff09; 是一种构建和运行应用程序的方法论&#xff0c;它利用云计算的优势&#xff08;弹性、分布式、自动化&#xff09;&#xff0c;让软件从设计…

动手学深度学习:线性回归神经网络

从零实现线性回归 生成数据 import torch def synthetic_data(w,b,num_examples):Xtorch.normal(0,1,(num_examples,len(w)))ytorch.matmul(X,w)bytorch.normal(0,0.1,y.shape)return X,y.reshape((-1,1)) true_wtorch.tensor([2,-3.4]).reshape(2,1) true_b4.2 features,lab…

第17篇:网络请求与Axios集成

目标&#xff1a;掌握在Vue3中规范地发起HTTP请求 1. 安装与基础配置 npm install axios // src/utils/request.js import axios from axios const service axios.create({ baseURL: https://api.example.com, timeout: 10000 }) export default service 2. 基础请…

正则表达式用法及其示例:匹配、查找、替换文本中的模式,及QT下如何使用正则表达式。

当然&#xff01;正则表达式是一种强大的工具&#xff0c;用于匹配、查找、替换文本中的模式。下面是一些常见的正则表达式用法及其示例。 1、基本语法 基本元字符和语法 .&#xff1a;匹配任意单个字符&#xff08;除了换行符&#xff09;。^&#xff1a;匹配输入字符串的开…

从零开始玩转TensorFlow:小明的机器学习故事 4

探索深度学习 1 场景故事&#xff1a;小明的灵感 前不久&#xff0c;小明一直在用传统的机器学习方法&#xff08;如线性回归、逻辑回归&#xff09;来预测学校篮球比赛的胜负。虽然在朋友们看来已经很不错了&#xff0c;但小明发现一个问题&#xff1a;当比赛数据越来越多、…