Java学习第七十四部分——Elasticsearch(ES)

目录

一、前言提要

二、核心特性

三、应用场景

四、主要优势

五、集成方式

六、基础操作

七、高级特性

八、概念类比——与关系型数据库

九、简单示例——实现存储与搜索

十、生态集成——基于Spring Data Elasticsearch

十一、性能优化建议

十二、总结归纳概述


一、前言提要

       Elasticsearch(ES)是一个开源的分布式搜索和分析引擎,基于Apache Lucene构建,专为海量数据的实时搜索、分析和可视化而设计。它是Elastic Stack(ELK Stack)的核心组件,广泛应用于日志分析、监控、电商搜索、安全事件检测等场景。

二、核心特性

特性说明
分布式架构自动分片、负载均衡、副本容灾,支持水平扩展
近实时搜索数据写入后1秒内即可被搜索到(NRT,Near Real-Time)
RESTful API通过HTTP+JSON即可操作,支持多种编程语言(Java、Python、Go等)
强大的查询语言支持全文检索、聚合分析、地理位置查询、模糊匹配等
Schema-Free无需预定义严格表结构(动态映射),兼容结构化/非结构化数据
高可用性自动发现节点、故障转移,支持跨集群复制(CCR)

三、应用场景

1. 日志收集与分析
   - 使用Logstash/Beats收集日志 → Elasticsearch存储 → Kibana可视化  
   - 例如:Nginx日志中查找500错误的IP分布。

2. 电商商品搜索
   - 支持分词搜索、拼音搜索、价格排序、聚合统计(如品牌、价格区间筛选)。

3. APM(应用性能监控) 
   - 存储系统指标(CPU、内存)、链路追踪数据(SkyWalking、Jaeger集成ES)。

4. 安全事件检测
   - 实时分析网络流量,检测异常行为(如暴力破解)。

四、主要优势

- PB级数据:毫秒级响应(如Twitter每日千亿级日志)。  
- 生态完善:与Kafka、Spark、Flink无缝集成。  
- 开箱即用:单节点即可启动,无需复杂配置。

五、集成方式

1. 官方高级REST客户端

// Maven依赖
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.17.9</version> <!-- 使用与你的ES集群匹配的版本 -->
</dependency>
// 初始化客户端
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http"))
);

2. 新版Java API Client(8.x+推荐)

// Maven依赖
<dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.11.0</version>
</dependency>
// 初始化客户端
ElasticsearchClient client = new ElasticsearchClient(RestClient.builder(new HttpHost("localhost", 9200))
);

六、基础操作

1. 索引文档

// 传统方式
IndexRequest request = new IndexRequest("posts").id("1").source("user", "kimchy", "postDate", new Date(), "message", "trying out Elasticsearch");
IndexResponse response = client.index(request, RequestOptions.DEFAULT);// 新版Java API
client.index(i -> i.index("posts").id("1").document(new Post("kimchy", new Date(), "trying out Elasticsearch"))
);

2. 搜索文档

// 传统方式
SearchRequest searchRequest = new SearchRequest("posts");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("user", "kimchy"));
searchRequest.source(sourceBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 新版Java API
SearchResponse<Post> response = client.search(s -> s.index("posts").query(q -> q.term(t -> t.field("user").value("kimchy"))),Post.class
);

七、高级特性

1. 批量操作

BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(new IndexRequest("posts").id("2").source(/* your doc */));
bulkRequest.add(new DeleteRequest("posts").id("1"));
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);

2. 聚合查询

SearchRequest request = new SearchRequest("sales");
TermsAggregationBuilder aggregation = AggregationBuilders.terms("top_tags").field("tags.keyword").size(10);
request.source().aggregation(aggregation);

3. 连接池配置

final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("user", "password")
);RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http")
).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider).setMaxConnTotal(100).setMaxConnPerRoute(20)
);

八、概念类比——与关系型数据库

关系型数据库(MySQL)Elasticsearch示例
Database(数据库)Index(索引)order_db → order_index
Table(表)Type(已废弃)/Mappinguser_table → user_doc
Row(行)Document(文档){"id":1, "name":"Alice"}
Column(列)Field(字段)name字段存储字符串
Schema(表结构)Mapping(映射)定义字段类型、分词器等
SQL查询DSL(JSON查询语言)SELECT * FROM user → GET /user/_search

九、简单示例——实现存储与搜索

1. 存储文档(PUT)

​PUT /products/_doc/1
{"name": "iPhone 15","price": 7999,"category": "手机"
}
​

2. 搜索文档(GET)

GET /products/_search
{"query": {"match": {"name": "iPhone"}},"sort": [{"price": "desc"}]
}

十、生态集成——基于Spring Data Elasticsearch

1. Spring Boot配置

@Configuration
public class ElasticsearchConfig {@Beanpublic ClientConfiguration clientConfiguration() {return ClientConfiguration.builder().connectedTo("localhost:9200").withBasicAuth("user", "password").build();}@Beanpublic ElasticsearchTemplate elasticsearchTemplate() {return new ElasticsearchTemplate(elasticsearchClient());}
}

2. 实体映射

@Document(indexName = "posts")
public class Post {@Id private String id;@Field(type = FieldType.Text) private String title;@Field(type = FieldType.Date) private Date date;// getters/setters
}

 3. Repository接口

public interface PostRepository extends ElasticsearchRepository<Post, String> {List<Post> findByTitleContaining(String title);@Query("{\"bool\": {\"must\": [{\"match\": {\"title\": \"?0\"}}]}}")Page<Post> findByTitle(String title, Pageable pageable);
}

十一、性能优化建议

1. 批量处理:使用bulk API进行批量索引
2. 连接管理:合理配置连接池大小
3. 索引优化:合理设置分片数和副本数
4. 查询优化:避免深度分页,使用scroll API处理大数据量
5. 缓存利用:合理使用filter上下文和系统缓存

十二、总结归纳概述

> Elasticsearch = 搜索引擎 + 分布式数据库 + 实时分析工具
> 专为“搜索一切”而生,从代码日志到宇宙射线数据皆可处理!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92881.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TDengine 转化函数 TO_UNIXTIMESTAMP 用户手册

TDengine TO_UNIXTIMESTAMP 函数用户使用手册 函数概述 TO_UNIXTIMESTAMP 是 TDengine 中的标量函数&#xff0c;用于将符合 ISO8601/RFC3339 标准的日期时间字符串转换为 Unix 时间戳。与 TO_TIMESTAMP 不同&#xff0c;该函数专门处理标准格式的时间字符串&#xff0c;无需指…

Java 中的排序算法详解

目录 一、冒泡排序&#xff08;Bubble Sort&#xff09; 原理​ 二、选择排序&#xff08;Selection Sort&#xff09; 原理​ 三、插入排序&#xff08;Insertion Sort&#xff09; 原理​ 四、快速排序&#xff08;Quick Sort&#xff09; 原理​ 五、归并排序&…

Gitee如何成为国内企业DevOps转型的首选平台?

Gitee如何成为国内企业DevOps转型的首选平台&#xff1f; 在数字化转型浪潮中&#xff0c;DevOps已成为提升企业研发效能的关键引擎。作为国内领先的代码托管与协作平台&#xff0c;Gitee凭借本土化优势与全流程支持能力&#xff0c;正成为越来越多企业DevOps实践的核心载体。本…

​Excel——SUMPRODUCT 函数

SUMPRODUCT 是 Excel 中最强大的函数之一&#xff0c;可以用于 ​多条件求和、加权计算、数组运算​ 等复杂场景。下面通过 ​基础语法 实用案例​ 彻底讲透它的用法&#xff01;​一、基础语法​SUMPRODUCT(数组1, [数组2], [数组3], ...)​功能​&#xff1a;将多个数组的对…

告别虚函数性能焦虑:深入剖析C++多态的现代设计模式

🚀 引言:当多态遇上性能瓶颈 我经常被问到这样一个问题:“既然virtual函数这么方便,为什么在一些高性能场景下,大家却避之不及?” 答案很简单:性能。 在我参与的多个HPC项目和游戏引擎开发中,virtual函数调用往往成为性能分析工具中最显眼的那个红点。一个看似无害…

k8s-MongoDB 副本集部署

前提准备一套 k8s 集群worker 节点上的 /nfs/data 目录挂载到磁盘一、NFS 高可用方案&#xff08;NFSkeepalivedSersync&#xff09;本方案 NFS 的高可用方案&#xff0c;应用服务器为 Client &#xff0c;两台文件服务器分别 Master 和 Slave&#xff0c;使用 keepalived 生成…

BI 系统数据看板全解析:让数据可视化驱动业务决策

BI 系统数据看板全解析&#xff1a;让数据可视化驱动业务决策在 BI 系统中&#xff0c;数据看板是连接原始数据与业务洞察的 “桥梁”。它将零散的业务指标转化为直观的可视化图表&#xff0c;让产品经理、运营人员等角色能快速把握业务动态。一个设计精良的数据看板&#xff0…

图机器学习(14)——社交网络分析

图机器学习&#xff08;14&#xff09;——社交网络分析0. 前言1. 数据集分析1.1 数据集介绍1.2 使用 networkx 加载数据集2. 网络拓扑和社区检测2.1 网络拓扑2.2 社区检测0. 前言 社交网站的崛起是近年来数字媒体领域最活跃的发展趋势之一&#xff0c;数字社交互动已经融入人…

深入解析Hadoop MapReduce中Reduce阶段排序的必要性

MapReduce概述与Reduce阶段简介MapReduce作为Hadoop生态系统的核心计算框架&#xff0c;其设计思想源自Google论文&#xff0c;通过"分而治之"的理念实现海量数据的并行处理。该模型将计算过程抽象为两个关键阶段&#xff1a;Map阶段负责数据分解和初步处理&#xff…

7月23日华为机考真题第二题-200分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ bishipass.com 02. 图书馆资源分配系统 问题描述 A先生是一位图书馆管理员,负责管理图书采购和分配工作。图书馆收到了来自不同出版社的图书批次,同时有多位读者代表排队申请图书…

基于深度学习的图像分类:使用ResNet实现高效分类

最近研学过程中发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…

JVM:工具

JVMjpsjstatjmapjhatjstackjconsolejvisualvmjps jps&#xff08; Java Virtual Machine Process Status Tool &#xff09;&#xff0c;是 JDK 中的一个命令行工具&#xff0c;用于列出当前正在运行的 JVM 实例的信息。其对于监控和管理运行在多个 JVM 上的 Java 应用程序特别…

Elasticsearch Circuit Breaker 全面解析与最佳实践

一、Circuit Breaker 简介 Elasticsearch 是基于 JVM 的搜索引擎&#xff0c;其内存管理十分重要。为了避免单个操作或查询耗费过多内存导致节点不可用&#xff0c;Elasticsearch 引入了 Circuit Breaker&#xff08;熔断器&#xff09;机制。当内存使用达到熔断器预设阈值时&a…

ARM-定时器-定时器函数封装配置

以TIMER7为例&#xff0c;对定时器函数进行封装注意事项&#xff1a;GD32中TIMER7是高级定时器&#xff0c;相关详细请参考上一篇文章。main.c//main.c#include "gd32f4xx.h" #include "systick.h" #include <stdio.h> #include "main.h" …

【日志】unity俄罗斯方块——边界限制检测

Bug修复记录 项目场景 尝试使用Unity独自制作俄罗斯方块&#xff08;也许很没有必要&#xff0c;网上随便一搜就有教程&#xff09; 问题描述 俄罗斯方块的边缘检测出错了&#xff0c;对方块进行旋转后&#xff0c;无法到达最左侧或者最下侧的位置&#xff0c;以及其他问题。演…

C++ string:准 STL Container

历史STL 最初是一套独立的泛型库&#xff08;Alexander Stepanov 等人贡献&#xff09;&#xff0c;后来被吸纳进 C 标准库&#xff1b;std::basic_string 则是早期 C 标准&#xff08;Cfront / ARM 时代&#xff09;就存在的“字符串类”&#xff0c;并非 STL 原生物。std::st…

Golang学习笔记--语言入门【Go-暑假学习笔记】

目录 基础语法部分相关概念 基础语法部分概念详解 可见性 导包 内部包 运算符 转义字符 函数 风格 函数花括号换行 代码缩进 代码间隔 花括号省略 三元表达式 数据类型部分相关概念 数据类型部分概念详解 布尔类型 整型 浮点型 复数类型 字符类型 派生类型…

linux中kill 命令使用详解

在Linux系统里&#xff0c;kill命令的主要功能是向进程发送信号&#xff0c;以此来控制进程的运行状态。下面为你详细介绍它的使用方法&#xff1a; 基础语法 kill [选项] [进程ID]进程ID也就是PID&#xff0c;可通过ps、pgrep或者top等命令来获取。 常用信号及其含义 信号可以…

Nginx 安装与 HTTPS 配置指南:使用 OpenSSL 搭建安全 Web 服务器

Nginx 安装与 HTTPS 配置指南:使用 OpenSSL 搭建安全 Web 服务器 一、Nginx安装 1. 安装依赖项 sudo yum groupinstall "Development Tools" -y # 非必须 sudo yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel -y2.下载Nginx wget http://n…

写个 flask todo app,简洁,实用

- 此项目虽然看起来简单&#xff0c;实际上&#xff0c;修改成自己喜欢的样子&#xff0c;也是费时间的。 - 别人都搞AI 相关的项目&#xff0c;而我还是搞这种基础的东西。不要灰心。 - 积累。不论项目大小&#xff0c;不论难易&#xff0c;只看是否有用。项目地址&#xff1a…