目錄
一、前言提要
二、核心特性
三、應用場景
四、主要優勢
五、集成方式
六、基礎操作
七、高級特性
八、概念類比——與關系型數據庫
九、簡單示例——實現存儲與搜索
十、生態集成——基于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(已廢棄)/Mapping | user_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 = 搜索引擎 + 分布式數據庫 + 實時分析工具
> 專為“搜索一切”而生,從代碼日志到宇宙射線數據皆可處理!