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

【Elasticsearch】(Java 版)

Elasticsearch(Java 版)

文章目录

  • Elasticsearch(Java 版)
    • **1. Elasticsearch 简介**
      • **1.1 什么是 Elasticsearch?**
      • **1.2 核心概念**
    • **2. 安装与配置**
      • **2.1 环境要求**
      • **2.2 安装步骤**
        • **Linux/macOS**
        • **Windows**
      • **2.3 验证安装**
      • **2.4 配置参数**
    • **3. Java 客户端操作**
      • **3.1 引入依赖**
      • **3.2 创建客户端**
      • **3.3 索引操作**
        • **创建索引**
        • **删除索引**
      • **3.4 文档操作**
        • **定义文档类**
        • **插入文档**
        • **查询文档**
        • **更新文档**
        • **删除文档**
      • **3.5 批量操作**
    • **4. 搜索与聚合**
      • **4.1 查询 DSL**
        • **简单匹配查询**
        • **复合查询(Bool Query)**
        • **聚合分析**
    • **5. 性能优化**
      • **5.1 分片与副本策略**
      • **5.2 写入优化**
      • **5.3 查询优化**
    • **6. 集群管理**
      • **6.1 查看集群健康状态**
    • **7. 学习资源**

1. Elasticsearch 简介

1.1 什么是 Elasticsearch?

  • 基于 Apache Lucene 的分布式搜索和分析引擎。
  • 支持近实时(NRT)搜索、结构化查询、全文检索、复杂聚合分析。
  • 适用于日志分析、监控系统、电商搜索、大数据分析等场景。

1.2 核心概念

  • 文档(Document):数据的基本单元(JSON 格式)。
  • 索引(Index):文档的集合(类似数据库中的表)。
  • 分片(Shard):索引的横向拆分,支持分布式存储。
  • 副本(Replica):分片的副本,提供高可用和负载均衡。
  • 节点(Node):单个 ES 实例,多个节点组成集群(Cluster)。
  • 倒排索引(Inverted Index):通过词项(Term)快速定位文档的数据结构。

2. 安装与配置

2.1 环境要求

  • JDK 8 或更高版本。
  • 推荐内存:4GB+,磁盘 SSD。

2.2 安装步骤

Linux/macOS
# 下载 Elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.0-linux-x86_64.tar.gz
tar -xzf elasticsearch-8.10.0-linux-x86_64.tar.gz
cd elasticsearch-8.10.0/# 启动单节点集群
./bin/elasticsearch
Windows
  1. 下载 ZIP 包并解压。
  2. 运行 bin\elasticsearch.bat

2.3 验证安装

访问 http://localhost:9200,返回 JSON 信息即成功:

{"name": "node-1","cluster_name": "elasticsearch","version": { ... }
}

2.4 配置参数

修改 config/elasticsearch.yml

cluster.name: my-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node  # 单节点模式

3. Java 客户端操作

3.1 引入依赖

pom.xml 中添加 Elasticsearch Java 客户端和 Jackson 依赖:

<dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.10.0</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.2</version>
</dependency>

3.2 创建客户端

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;public class ElasticsearchExample {public static void main(String[] args) {// 创建低级客户端,连接到本地 Elasticsearch 实例RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200) // ES 服务器地址和端口).build();// 创建传输层,使用 Jackson 作为 JSON 处理器ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());// 创建 Elasticsearch Java 客户端ElasticsearchClient client = new ElasticsearchClient(transport);// 后续操作可以使用 client 对象进行}
}

3.3 索引操作

创建索引
// 创建名为 "products" 的索引
client.indices().create(c -> c.index("products"));
System.out.println("索引创建成功!");
删除索引
// 删除名为 "products" 的索引
client.indices().delete(c -> c.index("products"));
System.out.println("索引删除成功!");

3.4 文档操作

定义文档类
public class Product {private String name;private double price;private String category;// 构造函数、Getter 和 Setter 方法public Product(String name, double price, String category) {this.name = name;this.price = price;this.category = category;}// Getter 和 Setter 方法public String getName() { return name; }public void setName(String name) { this.name = name; }public double getPrice() { return price; }public void setPrice(double price) { this.price = price; }public String getCategory() { return category; }public void setCategory(String category) { this.category = category; }
}
插入文档
// 创建一个 Product 对象
Product product = new Product("Laptop", 999.99, "Electronics");// 将文档插入到 "products" 索引中,ID 为 "1"
client.index(i -> i.index("products")  // 指定索引名称.id("1")           // 指定文档 ID.document(product) // 指定文档内容
);
System.out.println("文档插入成功!");
查询文档
// 根据 ID 查询文档
GetResponse<Product> response = client.get(g -> g.index("products")  // 指定索引名称.id("1"),           // 指定文档 IDProduct.class       // 指定返回的文档类型
);// 获取查询结果
Product product = response.source();
if (product != null) {System.out.println("查询结果:" + product.getName() + ", " + product.getPrice());
} else {System.out.println("未找到文档!");
}
更新文档
// 更新 ID 为 "1" 的文档
client.update(u -> u.index("products")  // 指定索引名称.id("1")           // 指定文档 ID.doc(new Product("Laptop", 899.99, "Electronics")), // 更新后的文档内容Product.class       // 指定文档类型
);
System.out.println("文档更新成功!");
删除文档
// 删除 ID 为 "1" 的文档
client.delete(d -> d.index("products")  // 指定索引名称.id("1")           // 指定文档 ID
);
System.out.println("文档删除成功!");

3.5 批量操作

// 创建批量请求构建器
BulkRequest.Builder br = new BulkRequest.Builder();// 添加第一个文档
br.operations(op -> op.index(i -> i.index("products")  // 指定索引名称.id("2")           // 指定文档 ID.document(new Product("Phone", 599.99, "Electronics")) // 文档内容)
);// 添加第二个文档
br.operations(op -> op.index(i -> i.index("products")  // 指定索引名称.id("3")           // 指定文档 ID.document(new Product("Tablet", 299.99, "Electronics")) // 文档内容)
);// 执行批量操作
client.bulk(br.build());
System.out.println("批量操作完成!");

4. 搜索与聚合

4.1 查询 DSL

简单匹配查询
// 查询 "products" 索引中 name 字段包含 "Laptop" 的文档
SearchResponse<Product> response = client.search(s -> s.index("products")  // 指定索引名称.query(q -> q       // 定义查询条件.match(m -> m   // 匹配查询.field("name")  // 指定字段.query("Laptop") // 查询值)),Product.class      // 指定返回的文档类型
);// 输出查询结果
for (Hit<Product> hit : response.hits().hits()) {System.out.println("查询结果:" + hit.source().getName());
}
复合查询(Bool Query)
// 查询 "products" 索引中 category 为 "Electronics" 且 price 大于等于 500 的文档
SearchResponse<Product> response = client.search(s -> s.index("products")  // 指定索引名称.query(q -> q       // 定义查询条件.bool(b -> b    // 布尔查询.must(m -> m.match(t -> t.field("category").query("Electronics"))) // 必须匹配的条件.filter(f -> f.range(r -> r.field("price").gte(JsonData.of(500)))) // 过滤条件),Product.class      // 指定返回的文档类型
);// 输出查询结果
for (Hit<Product> hit : response.hits().hits()) {System.out.println("查询结果:" + hit.source().getName() + ", " + hit.source().getPrice());
}
聚合分析
// 对 "products" 索引中的 price 字段进行平均值聚合
SearchResponse<Product> response = client.search(s -> s.index("products")  // 指定索引名称.aggregations("avg_price", a -> a // 定义聚合.avg(avg -> avg.field("price")) // 计算 price 字段的平均值),Product.class      // 指定返回的文档类型
);// 获取聚合结果
double avgPrice = response.aggregations().get("avg_price").avg().value();
System.out.println("平均价格:" + avgPrice);

5. 性能优化

5.1 分片与副本策略

  • 分片数在创建索引后不可修改,需提前规划。
  • 副本数可动态调整:PUT /products/_settings { "number_of_replicas": 2 }

5.2 写入优化

  • 使用批量 API 减少请求次数。
  • 调整 refresh_interval 降低刷新频率。

5.3 查询优化

  • 避免通配符查询(*)。
  • 使用 keyword 类型做精确匹配。

6. 集群管理

6.1 查看集群健康状态

// 获取集群健康状态
HealthResponse response = client.cluster().health();
System.out.println("集群状态:" + response.status());

7. 学习资源

  • 官方文档: https://www.elastic.co/guide
  • 书籍: 《Elasticsearch 权威指南》
  • 在线课程: Udemy 或 Coursera 上的 Elasticsearch 专项课程

通过本文档,您可以系统掌握 Elasticsearch 的核心功能与 Java 客户端操作。建议结合实际项目需求,进一步练习和优化代码。

相关文章:

【Elasticsearch】(Java 版)

Elasticsearch&#xff08;Java 版&#xff09; 文章目录 Elasticsearch&#xff08;Java 版&#xff09;**1. Elasticsearch 简介****1.1 什么是 Elasticsearch&#xff1f;****1.2 核心概念** **2. 安装与配置****2.1 环境要求****2.2 安装步骤****Linux/macOS****Windows** …...

DeepSeek在昇腾上的模型部署 - 常见问题及解决方案

2024年12月26日&#xff0c;DeepSeek-V3横空出世&#xff0c;以其卓越性能备受瞩目。该模型发布即支持昇腾&#xff0c;用户可在昇腾硬件和MindIE推理引擎上实现高效推理&#xff0c;但在实际操作中&#xff0c;部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾Dee…...

安全面试5

文章目录 sql的二次注入在linux下&#xff0c;现在有一个拥有大量ip地址的txt文本文档&#xff0c;但是里面有很多重复的&#xff0c;如何快速去重&#xff1f;在内网渗透中&#xff0c;通过钓鱼邮件获取到主机权限&#xff0c;但是发现内网拦截了tcp的出网流量&#xff0c;聊一…...

【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)

本章将详细介绍四大主流金融数据源&#xff08;Tushare、AkShare、Baostock、通联数据&#xff08;DataAPI&#xff09;&#xff09;&#xff0c;分析其特点与适用场景&#xff0c;并通过实战案例展示数据获取与处理的全流程。 &#x1f449; 点击关注不迷路 &#x1f449; 点击…...

Exoplayer(MediaX)实现音频变调和变速播放

在K歌或录音类应用中变调是个常见需求&#xff0c;比如需要播出萝莉音/大叔音等。变速播放在影视播放类应用中普遍存在&#xff0c;在传统播放器Mediaplayer中这两个功能都比较难以实现&#xff0c;特别在低版本SDK中&#xff0c;而Exoplayer作为google官方推出的Mediaplayer替…...

服务器间迁移conda环境

注意&#xff1a;可使用迁移miniconda文件 or 迁移yaml文件两种方式&#xff0c;推荐前者&#xff0c;基本无bug&#xff01; 一、迁移miniconda文件&#xff1a; 拷贝旧机器的miniconda文件文件到新机器: 内网拷贝&#xff1a;scp -r mazhf192.168.1.233:~/miniconda3 ~/ 外…...

docker高级

文章目录 1.Docker Compose1.1 介绍1.2 compose文件1.3 常用命令1.4 安装1.5 项目说明和构建1.5.1 手工启动1.5.2 compose 编排启动1.5.3 完善 compose.yml1.5.4 加入前端容器 2.UI管理平台2.1 portainer 3.镜像发布3.1 阿里云3.2 Docker Registry3.2.1 介绍3.2.2 安装3.2.3 测…...

Redis Stream基本使用及应用场景

一、概念 Redis Streams是Redis5.0提供的一种消息队列机制&#xff0c;支持多播的可持久化的消息队列&#xff0c;用户实现发布订阅的功能&#xff0c;借鉴了kafka设计。 二、常用命令 命令名称描述XADD key ID field value [field value ...]添加一条消息 key&#xff1a;St…...

DAY40|动态规划Part08|LeetCode: 121. 买卖股票的最佳时机 、 122.买卖股票的最佳时机II 、 123.买卖股票的最佳时机III

目录 LeetCode:121. 买卖股票的最佳时机 暴力解法 贪心法 动态规划法 LeetCode:122.买卖股票的最佳时机II 基本思路 LeetCode: 买卖股票的最佳时机III、IV 基本思路 C代码 LeetCode:121. 买卖股票的最佳时机 力扣题目链接 文字讲解&#xff1a;121. 买卖股票的最佳时…...

【安装及调试旧版Chrome + 多版本环境测试全攻略】

&#x1f468;&#x1f4bb; 安装及调试旧版Chrome 多版本环境测试全攻略 &#x1f310; &#xff08;新手友好版 | 覆盖安装/运行/调试全流程&#xff09; &#x1f570;️ 【背景篇】为什么我们需要旧版浏览器测试&#xff1f; &#x1f30d; &#x1f310; 浏览器世界的“…...

【Linux】进程间通信——命名管道

文章目录 命名管道什么是命名管道**命名管道 vs. 无名管道**如何创建命名管道 用命名管道实现进程间通信MakefileComm.hppServer.hppClient.hppServer.cppClient.cpp 效果总结 命名管道 什么是命名管道 命名管道&#xff0c;也称为 FIFO&#xff08;First In First Out&#…...

Qt在Linux嵌入式开发过程中复杂界面滑动时卡顿掉帧问题分析及解决方案

Qt在Linux嵌入式设备开发过程中&#xff0c;由于配置较低&#xff0c;加上没有GPU&#xff0c;我们有时候会遇到有些组件比较多的复杂界面&#xff0c;在滑动时会出现掉帧或卡顿的问题。要讲明白这个问题还得从CPU和GPU的分工说起。 一、硬件层面核心问题根源剖析 CPU&#x…...

AI学习第六天-python的基础使用-趣味图形

在 Python 编程学习过程中&#xff0c;turtle库是一个非常有趣且实用的工具&#xff0c;它可以帮助我们轻松绘制各种图形。结合for循环、random模块以及自定义方法等知识点&#xff0c;能够创作出丰富多彩的图案。下面就来分享一下相关的学习笔记。 一、基础知识点回顾 &…...

[VMware]卸载VMware虚拟机和Linux系统ubuntu(自记录版)

记录一下,不是教程,只是防止我做错了可以回溯一下 我打开vscode,就会跳出下图 虚拟机,Linux还是很久之前学习安装的,种途可能卸载过(不太记得了),现在尝试彻底卸载 彻底卸载VMware虚拟机的详细步骤-CSDN博客虚拟机Vmware 转移 克隆 卸载及移除Linux系统_克隆的虚拟机怎么移除-…...

J-LangChain,用Java实现LangChain编排!轻松加载PDF、切分文档、向量化存储,再到智能问答

Java如何玩转大模型编排、RAG、Agent&#xff1f;&#xff1f;&#xff1f; 在自然语言处理&#xff08;NLP&#xff09;的浪潮中&#xff0c;LangChain作为一种强大的模型编排框架&#xff0c;已经在Python社区中广受欢迎。然而&#xff0c;对于Java开发者来说&#xff0c;能…...

Cuppa CMS v1.0 任意文件读取(CVE-2022-25401)

漏洞简介&#xff1a; Cuppa CMS v1.0 administrator/templates/default/html/windows/right.php文件存在任意文件读取漏洞 漏洞环境&#xff1a; 春秋云镜中的漏洞靶标&#xff0c;CVE编号为CVE-2022-25401 漏洞复现 弱口令行不通 直接访问administrator/templates/defau…...

可以免费无限次下载PPT的网站

前言 最近发现了一个超实用的网站&#xff0c;想分享给大家。 在学习和工作的过程中&#xff0c;想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量&#xff0c;但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制&#xff0…...

STM32中使用PWM对舵机控制

目录 1、硬件JIE 2、PWM口配置 3、角度转换 4、main函数中应用 5、工程下载连接 1、硬件介绍 单片机&#xff1a;STM32F1 舵机&#xff1a;MG995 2、PWM口配置 20毫秒的PWM脉冲占空比&#xff0c;对舵机控制效果较好 计算的公式&#xff1a; PSC、ARR值的选取&#xf…...

使用插件 `vue2-water-marker`添加全局水印

使用插件 vue2-water-marker添加全局水印 效果图 1、安装插件 npm install vue2-water-marker --save2、全局注册 // main.js import Vue from vue import Vue2WaterMarker from vue2-water-markerVue.use(Vue2WaterMarker)3、在组件中使用 <template><div id&q…...

MySQL表约束的种类与应用

在MySQL数据库中&#xff0c;表约束是确保数据完整性的关键。约束限制了可以在表中插入或更新的数据类型&#xff0c;保证数据的准确性和可靠性。了解MySQL中的各种表约束对于数据库设计和数据维护至关重要。以下是MySQL支持的主要表约束类型及其应用的详细介绍。 1. 主键约束…...

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

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

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...