一、簡介
1. 概述
Elasticsearch是一個(gè)基于Lucene庫的開源搜索引擎,支持分布式、多租戶和全文搜索功能。它使用了RESTful API接口可以簡化對Elasticsearch的集成和擴(kuò)展。
2. 應(yīng)用場景
Elasticsearch廣泛應(yīng)用于全文搜索、日志存儲(chǔ)和分析、安全事件檢測、業(yè)務(wù)指標(biāo)分析等領(lǐng)域。
二、架構(gòu)
1. 節(jié)點(diǎn)和集群
Elasticsearch是一個(gè)分布式系統(tǒng)由多個(gè)節(jié)點(diǎn)組成。節(jié)點(diǎn)可以分為兩種類型:主節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)
主節(jié)點(diǎn)負(fù)責(zé)協(xié)調(diào)整個(gè)集群中的操作,例如創(chuàng)建或刪除索引、添加或刪除節(jié)點(diǎn)等等。每個(gè)集群只能有一個(gè)主節(jié)點(diǎn),當(dāng)主節(jié)點(diǎn)故障時(shí),其他節(jié)點(diǎn)將會(huì)選舉出新的主節(jié)點(diǎn)。
數(shù)據(jù)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù),并參與搜索操作。在集群中可以同時(shí)存在多個(gè)數(shù)據(jù)節(jié)點(diǎn),每個(gè)數(shù)據(jù)節(jié)點(diǎn)都包含了所有數(shù)據(jù)的一部分副本。
節(jié)點(diǎn)之間通過使用基于TCP的傳輸層通信,使用JSON格式進(jìn)行交互。
2. 索引和分片
Elasticsearch使用索引來組織和存儲(chǔ)數(shù)據(jù)。一個(gè)索引可以看作是一個(gè)關(guān)系型數(shù)據(jù)庫中的一個(gè)表,而每個(gè)文檔則相當(dāng)于一行數(shù)據(jù)。
為了支撐大規(guī)模數(shù)據(jù)存儲(chǔ),Elasticsearch將索引分成多個(gè)分片(shard),每個(gè)分片都是一個(gè)獨(dú)立的Lucene索引。當(dāng)一個(gè)索引被創(chuàng)建時(shí),可以指定分片的數(shù)量,在索引中的每個(gè)文檔將會(huì)被分配到一個(gè)確定的分片中。分片的數(shù)量一旦確定,就不能再更改。
分片帶來了好處,使得每個(gè)分片只需要存儲(chǔ)索引的一小部分?jǐn)?shù)據(jù),從而使它們更容易被存儲(chǔ)在單個(gè)節(jié)點(diǎn)之上。此外,分片還使得Elasticsearch可以水平擴(kuò)展,可以將不同的分片分配給不同的節(jié)點(diǎn)。
下面是Java代碼展示如何創(chuàng)建一個(gè)索引,設(shè)置分片數(shù)量為5,副本數(shù)量為1:
public void createIndex(RestHighLevelClient client, String indexName) throws IOException {
CreateIndexRequest request = new CreateIndexRequest(indexName);
// 設(shè)置分片數(shù)量為5,副本數(shù)量為1
request.settings(Settings.builder()
.put("index.number_of_shards", 5)
.put("index.number_of_replicas", 1)
);
client.indices().create(request, RequestOptions.DEFAULT);
}
三、查詢操作原理
1. 查詢DSL語法分類
在Elasticsearch中使用Query DSL(查詢領(lǐng)域特定語言)進(jìn)行查詢操作。查詢DSL分為兩大類:查詢查詢和聚合查詢。
1.1. 查詢查詢
查詢查詢用于從索引中獲取單個(gè)或多個(gè)文檔。以下是常用的查詢類型:
-
match
查詢:查找包含指定項(xiàng)的文檔。如下所示:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchResponse searchResponse = null;
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("title", "Elasticsearch");
searchSourceBuilder.query(matchQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("index-name");
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest, CommonOptions.DEFAULT);
-
term
查詢:查找與指定術(shù)語完全匹配的文檔。如下所示:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchResponse searchResponse = null;
TermQueryBuilder termQueryBuilder = new TermQueryBuilder("title.keyword", "Elasticsearch");
searchSourceBuilder.query(termQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("index-name");
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest, CommonOptions.DEFAULT);
-
bool
查詢:將多個(gè)查詢組合在一起,并通過邏輯運(yùn)算符來確定與查詢的真值。如下所示:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchResponse searchResponse = null;
MatchQueryBuilder matchQueryBuilder1 = new MatchQueryBuilder("title", "Elasticsearch");
MatchQueryBuilder matchQueryBuilder2 = new MatchQueryBuilder("content", "Java");
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(matchQueryBuilder1);
boolQueryBuilder.must(matchQueryBuilder2);
searchSourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("index-name");
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest, CommonOptions.DEFAULT);
1.2. 聚合查詢
聚合查詢用于從索引中獲取匯總信息。以下是常見的聚合類型:
-
avg
聚合:計(jì)算指定字段的平均值。如下所示:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchResponse searchResponse = null;
AvgAggregationBuilder aggregationBuilder = AggregationBuilders.avg("average_price").field("price");
searchSourceBuilder.aggregation(aggregationBuilder);
searchSourceBuilder.size(0); // return only aggregations and no hits
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("index-name");
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest, CommonOptions.DEFAULT);
-
max
聚合:計(jì)算指定字段的最大值。如下所示:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SearchResponse searchResponse = null;
MaxAggregationBuilder aggregationBuilder = AggregationBuilders.max("max_price").field("price");
searchSourceBuilder.aggregation(aggregationBuilder);
searchSourceBuilder.size(0); // return only aggregations and no hits
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("index-name");
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest, CommonOptions.DEFAULT);
2. Lucene 原理基礎(chǔ)
Elasticsearch是基于Lucene庫開發(fā)的。因此了解Lucene的一些基礎(chǔ)原理可以更好地理解Elasticsearch的查詢操作。Lucene是一個(gè)文檔檢索庫,用于快速地搜索大量文檔。以下是Lucene的一些關(guān)鍵概念:
-
Document
:文檔是Lucene中的最小檢索單位。每個(gè)文檔都由多個(gè)字段組成。 -
Field
:字段表示文檔的內(nèi)容。每個(gè)字段都有一個(gè)名字和值。 -
Analyzer
:分析器用于將文本轉(zhuǎn)換為詞條,這些詞條將存儲(chǔ)在倒排索引中。 -
Inverted Index
:倒排索引是一個(gè)包含單個(gè)詞匯條目的文檔列表的數(shù)據(jù)結(jié)構(gòu)。它使得快速查找文檔成為可能。 -
TF-IDF
:TF-IDF(詞頻 - 逆文檔頻率)是一種常見的檢索評估方法,用于計(jì)算文檔中單詞的重要性。
四、性能優(yōu)化實(shí)踐
1. 集群設(shè)置與調(diào)優(yōu)
1.1 分片
- 合理設(shè)置分片數(shù)量
- 分片數(shù)過多會(huì)降低索引和搜索的性能
- 建議每個(gè)節(jié)點(diǎn)最少設(shè)置兩個(gè)分片
- 分片平衡
- Elasticsearch自動(dòng)將副本分配到其他節(jié)點(diǎn)上
- 考慮使用Shard Allocation Awareness優(yōu)化跨機(jī)架部署,避免機(jī)架單點(diǎn)故障帶來的影響
1.2 副本
- 合理設(shè)置副本數(shù)量
- 副本數(shù)過多會(huì)增加集群負(fù)載,導(dǎo)致查詢變慢
- 建議副本數(shù)不超過節(jié)點(diǎn)數(shù)-1
- 副本位置
- 數(shù)據(jù)中心可用性高:副本置于其他服務(wù)器(或數(shù)據(jù)中心)
- 數(shù)據(jù)中心可用性低:副本置于相同服務(wù)器(或數(shù)據(jù)中心)
1.3 內(nèi)存
- 設(shè)置Xmx和Xms參數(shù),限制JVM使用的最大和最小內(nèi)存
- 注意JVM內(nèi)存與操作系統(tǒng)緩存的折衷,確保JVM能充分利用一定量的操作系統(tǒng)緩存
2. 索引和查詢性能優(yōu)化
2.1 索引
- 盡量減少分詞器的使用
- 禁用不必要的字段
- 確定合適的網(wǎng)絡(luò)延遲參數(shù),選擇正確的同步級別
- 通過Bulk API批量插入數(shù)據(jù)
2.2 查詢
- 查詢時(shí)避免全文搜索和模糊匹配
- 排序時(shí)應(yīng)使用docvalue進(jìn)行優(yōu)化
- 盡量使用過濾器而不是查詢器實(shí)現(xiàn)準(zhǔn)確匹配
3. 內(nèi)存及磁盤使用技巧
3.1 JVM內(nèi)存分配
- 應(yīng)使用cgroup限制Elasticsearch進(jìn)程的內(nèi)存使用
- 使用SSD硬盤加速索引和查詢操作
- 選擇合適的JVM垃圾回收策略以減輕內(nèi)存壓力
4. 正確使用搜索建議和聚合功能
4.1 搜索建議
- 使用completion suggester代替phrase suggester
- 建議根據(jù)具體場景合理設(shè)置suggest條目數(shù)量
4.2 聚合
- 對聚合結(jié)果進(jìn)行分析,確定最優(yōu)聚合方式
- 避免數(shù)據(jù)分散,在數(shù)據(jù)時(shí)間窗口內(nèi)按照時(shí)間排序
五、擴(kuò)展與集成
1. 插件開發(fā)以及集成
在Elasticsearch中插件可以擴(kuò)展和定制Elasticsearch的功能,包括增加新的API端點(diǎn)、集成外部組件或是創(chuàng)建自己的查詢方式等等。要開發(fā)和集成插件,可以按照以下步驟進(jìn)行:
步驟1:編寫插件代碼
開發(fā)插件可以使用Java編寫,并打包成jar文件,也可以使用Elasticsearch提供的Gradle插件進(jìn)行構(gòu)建。在插件代碼中,需要實(shí)現(xiàn)Plugin
接口,并覆蓋getSettings()
方法以提供插件設(shè)置,默認(rèn)情況下,插件不需要任何設(shè)置。此外還需要實(shí)現(xiàn)onModule()
方法來注冊各種組件,包括自定義的QueryBuilder、Aggregator等。例如以下代碼展示如何注冊一個(gè)自定義查詢:
public class MyQueryPlugin extends Plugin {
@Override
public Settings getSettings() {
return Settings.builder()
.put("my_setting", "default_value")
.build();
}
@Override
public List<QuerySpec<?>> getQueries(QuerySpecRegistry querySpecRegistry) {
return Collections.singletonList(
new QuerySpec.Builder("myQuery", MyQueryBuilder::new, MyQueryBuilder::fromXContent)
.build()
);
}
// 其他組件的注冊
}
步驟2:打包插件
完成插件代碼編寫后需要將插件打包為.zip格式,并放入Elasticsearch的plugins
目錄下。要注意的是在打包插件時(shí),需要在根目錄下創(chuàng)建es-plugin.properties
文件,并設(shè)置插件的名字和版本號,例如:
name=my-plugin
version=1.0.0
步驟3:安裝插件
將插件打包好并放入plugins
目錄后,需要重啟Elasticsearch節(jié)點(diǎn)以完成插件安裝。如果一切正常,可以在Elasticsearch的日志中看到類似于以下的輸出信息:
[2019-04-06T15:55:21,926][INFO ][o.e.p.PluginsService ] [node-1] loaded module [my-module]
[2019-04-06T15:55:21,927][INFO ][o.e.p.PluginsService ] [node-1] loaded plugin [my-plugin]
2. 生態(tài)系統(tǒng)
Elasticsearch生態(tài)系統(tǒng)提供了大量的基于Elasticsearch的工具和庫,包括:
- Kibana:數(shù)據(jù)可視化和分析平臺(tái)
- Logstash:日志流處理工具
- Beats:輕量的數(shù)據(jù)采集代理
- Elasticsearch-Hadoop:連接Hadoop生態(tài)系統(tǒng)和Elasticsearch
- elasticsearch-mapper-attachments插件:支持在Elasticsearch中索引和搜索各種文檔格式
這些工具和庫可以一起使用,構(gòu)建出更加強(qiáng)大、靈活和高效的數(shù)據(jù)分析和搜索方案。
六、大數(shù)據(jù)技術(shù)集成
1. Hadoop集成
1.1 Hadoop技術(shù)介紹
Hadoop是一個(gè)開源的分布式數(shù)據(jù)處理框架,最初是為了處理大規(guī)模的結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)而設(shè)計(jì)。它包括了HDFS(Hadoop Distributed File System)和MapReduce兩個(gè)核心組件,可以實(shí)現(xiàn)大規(guī)模數(shù)據(jù)存儲(chǔ)、處理和分析。
Elasticsearch是一個(gè)開源的搜索引擎,基于Lucene構(gòu)建,支持全文搜索、分面搜索、結(jié)構(gòu)化搜索等功能。它被廣泛應(yīng)用在企業(yè)級搜索、日志分析、安全分析等領(lǐng)域。
1.2 Hadoop集成方案
Hadoop與Elasticsearch集成主要有以下兩種方式:
-
使用Elasticsearch的Hadoop插件,將Elasticsearch作為Hadoop的輸出格式,可以方便地把Hadoop的計(jì)算結(jié)果寫入到Elasticsearch中。
-
使用Hadoop的Elasticsearch插件,將Elasticsearch作為Hadoop的輸入格式,可以直接從Elasticsearch中讀取數(shù)據(jù)進(jìn)行計(jì)算。
1.3 Hadoop集成的優(yōu)點(diǎn)
Hadoop與Elasticsearch集成可以帶來以下幾個(gè)優(yōu)點(diǎn):
-
處理大規(guī)模數(shù)據(jù):Hadoop可以有效地處理大規(guī)模的數(shù)據(jù),而Elasticsearch則可以對這些數(shù)據(jù)進(jìn)行高效的檢索和分析,結(jié)合起來可以實(shí)現(xiàn)大規(guī)模數(shù)據(jù)的存儲(chǔ)、處理和分析。
-
快速檢索:由于Elasticsearch的搜索引擎支持全文搜索、分面搜索等功能,可以快速地檢索出需要的數(shù)據(jù)。
-
靈活性:Hadoop可以根據(jù)數(shù)據(jù)的不同進(jìn)行多種計(jì)算操作,而Elasticsearch也可以根據(jù)不同的需求進(jìn)行數(shù)據(jù)的不同處理,這兩個(gè)框架的靈活性相互補(bǔ)充,可以滿足不同場景的需求。
2. Spark集成
2.1 Spark技術(shù)介紹
Spark是一個(gè)開源的大數(shù)據(jù)處理框架,可以進(jìn)行內(nèi)存計(jì)算、離線批處理、流式處理、機(jī)器學(xué)習(xí)等多種計(jì)算。它具有高速的內(nèi)存計(jì)算能力、良好的易用性和豐富的生態(tài)系統(tǒng)。
Spark與Elasticsearch集成可以帶來以下幾個(gè)優(yōu)點(diǎn):
-
高速的內(nèi)存計(jì)算:Spark擁有高速的內(nèi)存計(jì)算能力,可以快速地處理大規(guī)模數(shù)據(jù)。而Elasticsearch又可以快速地檢索所需的數(shù)據(jù),兩者協(xié)同可以更快地完成數(shù)據(jù)處理任務(wù)。
-
良好的易用性:Spark的API具有良好的易用性,操作簡單直觀。通過Spark對Elasticsearch中的數(shù)據(jù)進(jìn)行處理,可以方便地進(jìn)行數(shù)據(jù)分析和挖掘。
2.2 Spark集成方案
Spark可以通過Elasticsearch Hadoop插件實(shí)現(xiàn)與Elasticsearch的集成,這個(gè)插件可以將Spark作為Hadoop的一個(gè)計(jì)算引擎,可以讀取和寫入Elasticsearch中的數(shù)據(jù)。具體步驟如下:
-
下載并安裝Elasticsearch Hadoop插件。
-
在Spark應(yīng)用程序中添加相關(guān)依賴。
-
在Spark應(yīng)用程序中使用Spark SQL或DataFrame API連接Elasticsearch并進(jìn)行數(shù)據(jù)處理。
2.3 Spark集成的優(yōu)點(diǎn)
Spark與Elasticsearch集成可以帶來以下幾個(gè)優(yōu)點(diǎn):
-
快速處理大數(shù)據(jù):Spark可以快速地處理大規(guī)模數(shù)據(jù),而Elasticsearch可以快速地檢索所需的數(shù)據(jù),兩者協(xié)同可以更快地完成數(shù)據(jù)處理任務(wù)。
-
容錯(cuò)性:Spark具有良好的容錯(cuò)機(jī)制,可以確保數(shù)據(jù)處理任務(wù)的穩(wěn)定運(yùn)行。而Elasticsearch也有自己的容錯(cuò)機(jī)制,可以防止數(shù)據(jù)丟失和數(shù)據(jù)損壞。
3. Logstash集成
3.1 Logstash技術(shù)介紹
Logstash是一個(gè)開源的數(shù)據(jù)收集、處理和轉(zhuǎn)發(fā)工具,可以將各種數(shù)據(jù)源(如Web服務(wù)器、數(shù)據(jù)庫、消息隊(duì)列等)中的數(shù)據(jù)采集并送到不同的目的地。
Logstash可以通過Elasticsearch輸出插件將數(shù)據(jù)寫入Elasticsearch中,這樣就可以快速地實(shí)現(xiàn)數(shù)據(jù)的檢索和分析。
3.2 Logstash集成方案
Logstash可以通過Elasticsearch輸出插件實(shí)現(xiàn)與Elasticsearch的集成,具體步驟如下:
-
下載并安裝Logstash和Elasticsearch。
-
在Logstash配置文件中添加Elasticsearch輸出插件,并指定Elasticsearch的連接信息和數(shù)據(jù)的索引名稱等信息。
-
啟動(dòng)Logstash并開始數(shù)據(jù)采集和處理任務(wù)。
3.3 Logstash集成的優(yōu)點(diǎn)
Logstash與Elasticsearch集成可以帶來以下幾個(gè)優(yōu)點(diǎn):
-
高效的數(shù)據(jù)處理:Logstash可以快速地從各種數(shù)據(jù)源中采集數(shù)據(jù)并進(jìn)行處理,而Elasticsearch可以對這些數(shù)據(jù)進(jìn)行高效的檢索和分析。文章來源:http://www.zghlxwxcb.cn/news/detail-474089.html
-
靈活性:通過Logstash的數(shù)據(jù)處理管道,可以對不同類型的數(shù)據(jù)進(jìn)行靈活的處理和轉(zhuǎn)換,而Elasticsearch可以根據(jù)不同的需求進(jìn)行數(shù)據(jù)的不同處理,這兩個(gè)框架的靈活性相互補(bǔ)充,可以滿足不同場景的需求。文章來源地址http://www.zghlxwxcb.cn/news/detail-474089.html
到了這里,關(guān)于Elasticsearch 底層技術(shù)原理以及性能優(yōu)化實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!