Elasticsearch是一个基于Lucene库的开源搜索引擎,支持分布式、多租户和全文搜索功能。它使用了RESTful API接口可以简化对Elasticsearch的集成和扩展。
Elasticsearch广泛应用于全文搜索、日志存储和分析、安全事件检测、业务指标分析等领域。
Elasticsearch是一个分布式系统由多个节点组成。节点可以分为两种类型:主节点和数据节点
主节点负责协调整个集群中的操作,例如创建或删除索引、添加或删除节点等等。每个集群只能有一个主节点,当主节点故障时,其他节点将会选举出新的主节点。
数据节点存储数据,并参与搜索操作。在集群中可以同时存在多个数据节点,每个数据节点都包含了所有数据的一部分副本。
节点之间通过使用基于TCP的传输层通信,使用JSON格式进行交互。
Elasticsearch使用索引来组织和存储数据。一个索引可以看作是一个关系型数据库中的一个表,而每个文档则相当于一行数据。
为了支撑大规模数据存储,Elasticsearch将索引分成多个分片(shard),每个分片都是一个独立的Lucene索引。当一个索引被创建时,可以指定分片的数量,在索引中的每个文档将会被分配到一个确定的分片中。分片的数量一旦确定,就不能再更改。
分片带来了好处,使得每个分片只需要存储索引的一小部分数据,从而使它们更容易被存储在单个节点之上。此外,分片还使得Elasticsearch可以水平扩展,可以将不同的分片分配给不同的节点。
下面是Java代码展示如何创建一个索引,设置分片数量为5,副本数量为1:
public void createIndex(RestHighLevelClient client, String indexName) throws IOException {
CreateIndexRequest request = new CreateIndexRequest(indexName);
// 设置分片数量为5,副本数量为1
request.settings(Settings.builder()
.put("index.number_of_shards", 5)
.put("index.number_of_replicas", 1)
);
client.indices().create(request, RequestOptions.DEFAULT);
}
在Elasticsearch中使用Query DSL(查询领域特定语言)进行查询操作。查询DSL分为两大类:查询查询和聚合查询。
查询查询用于从索引中获取单个或多个文档。以下是常用的查询类型:
match
查询:查找包含指定项的文档。如下所示: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
查询:查找与指定术语完全匹配的文档。如下所示: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
查询:将多个查询组合在一起,并通过逻辑运算符来确定与查询的真值。如下所示: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);
聚合查询用于从索引中获取汇总信息。以下是常见的聚合类型:
avg
聚合:计算指定字段的平均值。如下所示: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
聚合:计算指定字段的最大值。如下所示: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);
Elasticsearch是基于Lucene库开发的。因此了解Lucene的一些基础原理可以更好地理解Elasticsearch的查询操作。Lucene是一个文档检索库,用于快速地搜索大量文档。以下是Lucene的一些关键概念:
Document
:文档是Lucene中的最小检索单位。每个文档都由多个字段组成。
Field
:字段表示文档的内容。每个字段都有一个名字和值。
Analyzer
:分析器用于将文本转换为词条,这些词条将存储在倒排索引中。
Inverted Index
:倒排索引是一个包含单个词汇条目的文档列表的数据结构。它使得快速查找文档成为可能。
TF-IDF
:TF-IDF(词频 - 逆文档频率)是一种常见的检索评估方法,用于计算文档中单词的重要性。
在Elasticsearch中插件可以扩展和定制Elasticsearch的功能,包括增加新的API端点、集成外部组件或是创建自己的查询方式等等。要开发和集成插件,可以按照以下步骤进行:
开发插件可以使用Java编写,并打包成jar文件,也可以使用Elasticsearch提供的Gradle插件进行构建。在插件代码中,需要实现Plugin
接口,并覆盖getSettings()
方法以提供插件设置,默认情况下,插件不需要任何设置。此外还需要实现onModule()
方法来注册各种组件,包括自定义的QueryBuilder、Aggregator等。例如以下代码展示如何注册一个自定义查询:
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()
);
}
// 其他组件的注册
}
完成插件代码编写后需要将插件打包为.zip格式,并放入Elasticsearch的plugins
目录下。要注意的是在打包插件时,需要在根目录下创建es-plugin.properties
文件,并设置插件的名字和版本号,例如:
name=my-plugin
version=1.0.0
将插件打包好并放入plugins
目录后,需要重启Elasticsearch节点以完成插件安装。如果一切正常,可以在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]
Elasticsearch生态系统提供了大量的基于Elasticsearch的工具和库,包括:
这些工具和库可以一起使用,构建出更加强大、灵活和高效的数据分析和搜索方案。
Hadoop是一个开源的分布式数据处理框架,最初是为了处理大规模的结构化和半结构化数据而设计。它包括了HDFS(Hadoop Distributed File System)和MapReduce两个核心组件,可以实现大规模数据存储、处理和分析。
Elasticsearch是一个开源的搜索引擎,基于Lucene构建,支持全文搜索、分面搜索、结构化搜索等功能。它被广泛应用在企业级搜索、日志分析、安全分析等领域。
Hadoop与Elasticsearch集成主要有以下两种方式:
使用Elasticsearch的Hadoop插件,将Elasticsearch作为Hadoop的输出格式,可以方便地把Hadoop的计算结果写入到Elasticsearch中。
使用Hadoop的Elasticsearch插件,将Elasticsearch作为Hadoop的输入格式,可以直接从Elasticsearch中读取数据进行计算。
Hadoop与Elasticsearch集成可以带来以下几个优点:
处理大规模数据:Hadoop可以有效地处理大规模的数据,而Elasticsearch则可以对这些数据进行高效的检索和分析,结合起来可以实现大规模数据的存储、处理和分析。
快速检索:由于Elasticsearch的搜索引擎支持全文搜索、分面搜索等功能,可以快速地检索出需要的数据。
灵活性:Hadoop可以根据数据的不同进行多种计算操作,而Elasticsearch也可以根据不同的需求进行数据的不同处理,这两个框架的灵活性相互补充,可以满足不同场景的需求。
Spark是一个开源的大数据处理框架,可以进行内存计算、离线批处理、流式处理、机器学习等多种计算。它具有高速的内存计算能力、良好的易用性和丰富的生态系统。
Spark与Elasticsearch集成可以带来以下几个优点:
高速的内存计算:Spark拥有高速的内存计算能力,可以快速地处理大规模数据。而Elasticsearch又可以快速地检索所需的数据,两者协同可以更快地完成数据处理任务。
良好的易用性:Spark的API具有良好的易用性,操作简单直观。通过Spark对Elasticsearch中的数据进行处理,可以方便地进行数据分析和挖掘。
Spark可以通过Elasticsearch Hadoop插件实现与Elasticsearch的集成,这个插件可以将Spark作为Hadoop的一个计算引擎,可以读取和写入Elasticsearch中的数据。具体步骤如下:
下载并安装Elasticsearch Hadoop插件。
在Spark应用程序中添加相关依赖。
在Spark应用程序中使用Spark SQL或DataFrame API连接Elasticsearch并进行数据处理。
Spark与Elasticsearch集成可以带来以下几个优点:
快速处理大数据:Spark可以快速地处理大规模数据,而Elasticsearch可以快速地检索所需的数据,两者协同可以更快地完成数据处理任务。
容错性:Spark具有良好的容错机制,可以确保数据处理任务的稳定运行。而Elasticsearch也有自己的容错机制,可以防止数据丢失和数据损坏。
Logstash是一个开源的数据收集、处理和转发工具,可以将各种数据源(如Web服务器、数据库、消息队列等)中的数据采集并送到不同的目的地。
Logstash可以通过Elasticsearch输出插件将数据写入Elasticsearch中,这样就可以快速地实现数据的检索和分析。
Logstash可以通过Elasticsearch输出插件实现与Elasticsearch的集成,具体步骤如下:
下载并安装Logstash和Elasticsearch。
在Logstash配置文件中添加Elasticsearch输出插件,并指定Elasticsearch的连接信息和数据的索引名称等信息。
启动Logstash并开始数据采集和处理任务。
Logstash与Elasticsearch集成可以带来以下几个优点:
高效的数据处理:Logstash可以快速地从各种数据源中采集数据并进行处理,而Elasticsearch可以对这些数据进行高效的检索和分析。
灵活性:通过Logstash的数据处理管道,可以对不同类型的数据进行灵活的处理和转换,而Elasticsearch可以根据不同的需求进行数据的不同处理,这两个框架的灵活性相互补充,可以满足不同场景的需求。