【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
- 下载 ZIP 包并解压。
- 运行
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(Java 版) 文章目录 Elasticsearch(Java 版)**1. Elasticsearch 简介****1.1 什么是 Elasticsearch?****1.2 核心概念** **2. 安装与配置****2.1 环境要求****2.2 安装步骤****Linux/macOS****Windows** …...
DeepSeek在昇腾上的模型部署 - 常见问题及解决方案
2024年12月26日,DeepSeek-V3横空出世,以其卓越性能备受瞩目。该模型发布即支持昇腾,用户可在昇腾硬件和MindIE推理引擎上实现高效推理,但在实际操作中,部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾Dee…...
安全面试5
文章目录 sql的二次注入在linux下,现在有一个拥有大量ip地址的txt文本文档,但是里面有很多重复的,如何快速去重?在内网渗透中,通过钓鱼邮件获取到主机权限,但是发现内网拦截了tcp的出网流量,聊一…...
【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)
本章将详细介绍四大主流金融数据源(Tushare、AkShare、Baostock、通联数据(DataAPI)),分析其特点与适用场景,并通过实战案例展示数据获取与处理的全流程。 👉 点击关注不迷路 👉 点击…...
Exoplayer(MediaX)实现音频变调和变速播放
在K歌或录音类应用中变调是个常见需求,比如需要播出萝莉音/大叔音等。变速播放在影视播放类应用中普遍存在,在传统播放器Mediaplayer中这两个功能都比较难以实现,特别在低版本SDK中,而Exoplayer作为google官方推出的Mediaplayer替…...
服务器间迁移conda环境
注意:可使用迁移miniconda文件 or 迁移yaml文件两种方式,推荐前者,基本无bug! 一、迁移miniconda文件: 拷贝旧机器的miniconda文件文件到新机器: 内网拷贝: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提供的一种消息队列机制,支持多播的可持久化的消息队列,用户实现发布订阅的功能,借鉴了kafka设计。 二、常用命令 命令名称描述XADD key ID field value [field value ...]添加一条消息 key:St…...
DAY40|动态规划Part08|LeetCode: 121. 买卖股票的最佳时机 、 122.买卖股票的最佳时机II 、 123.买卖股票的最佳时机III
目录 LeetCode:121. 买卖股票的最佳时机 暴力解法 贪心法 动态规划法 LeetCode:122.买卖股票的最佳时机II 基本思路 LeetCode: 买卖股票的最佳时机III、IV 基本思路 C代码 LeetCode:121. 买卖股票的最佳时机 力扣题目链接 文字讲解:121. 买卖股票的最佳时…...
【安装及调试旧版Chrome + 多版本环境测试全攻略】
👨💻 安装及调试旧版Chrome 多版本环境测试全攻略 🌐 (新手友好版 | 覆盖安装/运行/调试全流程) 🕰️ 【背景篇】为什么我们需要旧版浏览器测试? 🌍 🌐 浏览器世界的“…...
【Linux】进程间通信——命名管道
文章目录 命名管道什么是命名管道**命名管道 vs. 无名管道**如何创建命名管道 用命名管道实现进程间通信MakefileComm.hppServer.hppClient.hppServer.cppClient.cpp 效果总结 命名管道 什么是命名管道 命名管道,也称为 FIFO(First In First Out&#…...
Qt在Linux嵌入式开发过程中复杂界面滑动时卡顿掉帧问题分析及解决方案
Qt在Linux嵌入式设备开发过程中,由于配置较低,加上没有GPU,我们有时候会遇到有些组件比较多的复杂界面,在滑动时会出现掉帧或卡顿的问题。要讲明白这个问题还得从CPU和GPU的分工说起。 一、硬件层面核心问题根源剖析 CPU&#x…...
AI学习第六天-python的基础使用-趣味图形
在 Python 编程学习过程中,turtle库是一个非常有趣且实用的工具,它可以帮助我们轻松绘制各种图形。结合for循环、random模块以及自定义方法等知识点,能够创作出丰富多彩的图案。下面就来分享一下相关的学习笔记。 一、基础知识点回顾 &…...
[VMware]卸载VMware虚拟机和Linux系统ubuntu(自记录版)
记录一下,不是教程,只是防止我做错了可以回溯一下 我打开vscode,就会跳出下图 虚拟机,Linux还是很久之前学习安装的,种途可能卸载过(不太记得了),现在尝试彻底卸载 彻底卸载VMware虚拟机的详细步骤-CSDN博客虚拟机Vmware 转移 克隆 卸载及移除Linux系统_克隆的虚拟机怎么移除-…...
J-LangChain,用Java实现LangChain编排!轻松加载PDF、切分文档、向量化存储,再到智能问答
Java如何玩转大模型编排、RAG、Agent??? 在自然语言处理(NLP)的浪潮中,LangChain作为一种强大的模型编排框架,已经在Python社区中广受欢迎。然而,对于Java开发者来说,能…...
Cuppa CMS v1.0 任意文件读取(CVE-2022-25401)
漏洞简介: Cuppa CMS v1.0 administrator/templates/default/html/windows/right.php文件存在任意文件读取漏洞 漏洞环境: 春秋云镜中的漏洞靶标,CVE编号为CVE-2022-25401 漏洞复现 弱口令行不通 直接访问administrator/templates/defau…...
可以免费无限次下载PPT的网站
前言 最近发现了一个超实用的网站,想分享给大家。 在学习和工作的过程中,想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量,但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制࿰…...
STM32中使用PWM对舵机控制
目录 1、硬件JIE 2、PWM口配置 3、角度转换 4、main函数中应用 5、工程下载连接 1、硬件介绍 单片机:STM32F1 舵机:MG995 2、PWM口配置 20毫秒的PWM脉冲占空比,对舵机控制效果较好 计算的公式: PSC、ARR值的选取…...
使用插件 `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数据库中,表约束是确保数据完整性的关键。约束限制了可以在表中插入或更新的数据类型,保证数据的准确性和可靠性。了解MySQL中的各种表约束对于数据库设计和数据维护至关重要。以下是MySQL支持的主要表约束类型及其应用的详细介绍。 1. 主键约束…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,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 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过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连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
