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
英文地址,請注明出處:http://en.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…