1、Elasticsearch 简介
Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎,由 Elastic 公司开发并维护。它最初于2010年发布,迅速成为大数据领域中处理和分析海量数据的热门工具。Elasticsearch 的核心功能包括全文搜索、结构化搜索、数据分析以及实时数据处理。其设计理念是提供一个简单易用的接口,使得用户能够快速构建和部署复杂的搜索和分析应用。
Elasticsearch 的主要特点包括:
- 分布式架构:Elasticsearch 采用分布式架构,能够自动分片和复制数据,确保高可用性和可扩展性。
- 实时搜索:支持近乎实时的搜索和数据分析,数据写入后几乎立即可以被搜索到。
- 全文搜索:强大的全文搜索能力,支持多种查询类型和复杂的查询语法。
- 数据分析:内置丰富的聚合功能,支持对数据进行多维度的分析和统计。
- RESTful API:提供简单易用的 RESTful API,方便开发者通过 HTTP 请求与 Elasticsearch 进行交互。
Elasticsearch 的应用场景非常广泛,涵盖了多个行业和领域。例如,在电子商务中,Elasticsearch 可以用于商品搜索和推荐系统;在日志分析中,它可以用于实时监控和故障排查;在内容管理系统中,它可以用于全文搜索和内容检索。此外,Elasticsearch 还被广泛应用于网络安全、金融分析、医疗数据分析等领域。
总的来说,Elasticsearch 凭借其强大的搜索和分析能力,以及灵活的分布式架构,已经成为现代数据处理和分析领域不可或缺的工具。
2、Elasticsearch 的基本概念和术语
在深入了解 Elasticsearch 的实战应用之前,首先需要掌握一些基本概念和术语,这些概念是理解和使用 Elasticsearch 的基础。
-
索引(Index):索引是 Elasticsearch 中存储数据的基本单位,类似于关系型数据库中的数据库。每个索引由一个或多个分片组成,分片可以分布在不同的节点上,以实现数据的分布式存储和处理。索引的创建和管理是 Elasticsearch 数据管理的核心操作之一。
-
文档(Document):文档是 Elasticsearch 中存储的基本数据单元,类似于关系型数据库中的记录。每个文档都有一个唯一的 ID,并且可以包含多个字段。文档以 JSON 格式存储,支持嵌套结构和复杂数据类型。文档的索引和检索是 Elasticsearch 最常见的操作之一。
-
字段(Field):字段是文档中的数据项,类似于关系型数据库中的列。每个字段都有一个数据类型,如字符串、整数、日期等。字段的数据类型决定了 Elasticsearch 如何索引和搜索该字段的数据。字段的定义和管理是索引设计的重要部分。
-
映射(Mapping):映射定义了索引中字段的类型和属性,类似于关系型数据库中的表结构定义。映射可以手动创建,也可以由 Elasticsearch 自动推断。映射的定义直接影响数据的索引和搜索效率。
-
查询(Query):查询是 Elasticsearch 中用于检索数据的操作。Elasticsearch 支持多种查询类型,包括全文搜索、结构化搜索、聚合查询等。查询可以通过 RESTful API 或客户端库发送给 Elasticsearch,并返回符合条件的结果。
-
聚合(Aggregation):聚合是 Elasticsearch 中用于数据分析的功能,类似于 SQL 中的 GROUP BY 操作。聚合可以对数据进行分组、统计、计算等操作,生成汇总结果。聚合功能在数据分析和报表生成中非常有用。
-
分片(Shard):分片是索引数据在物理存储上的划分,每个分片是一个独立的 Lucene 索引。分片可以分布在不同的节点上,以实现数据的分布式存储和处理。分片的数量和分布策略直接影响系统的性能和可扩展性。
-
副本(Replica):副本是分片的备份,用于提高数据的可用性和容错能力。每个分片可以有多个副本,副本可以分布在不同的节点上。副本的存在使得 Elasticsearch 能够在节点故障时继续提供服务。
-
节点(Node):节点是 Elasticsearch 集群中的一个服务器实例,负责存储数据和处理请求。节点可以分为多种角色,如主节点、数据节点、协调节点等。节点的配置和管理是 Elasticsearch 集群部署的重要部分。
-
集群(Cluster):集群是多个节点的集合,共同提供搜索和分析服务。集群中的节点通过网络通信,协同工作以实现数据的分布式存储和处理。集群的健康状态和性能监控是 Elasticsearch 运维的重要任务。
通过理解这些基本概念和术语,可以更好地掌握 Elasticsearch 的工作原理和使用方法,为后续的实战应用打下坚实的基础。
3、Elasticsearch 的安装与配置
在开始使用 Elasticsearch 之前,首先需要进行安装和配置。Elasticsearch 的安装过程相对简单,但配置选项较多,需要根据实际需求进行调整。以下是详细的安装和配置步骤。
3.1、安装 Elasticsearch
Elasticsearch 支持多种操作系统,包括 Linux、Windows 和 macOS。以下是基于 Linux 系统的安装步骤:
-
下载 Elasticsearch : 访问 Elasticsearch 的官方网站(https://www.elastic.co/downloads/elasticsearch),下载适合你操作系统的安装包。
-
解压安装包: 使用以下命令解压下载的安装包:
bashtar -xzf elasticsearch-<version>.tar.gz
-
启动 Elasticsearch: 进入解压后的目录,运行以下命令启动 Elasticsearch:
bashcd elasticsearch-<version> ./bin/elasticsearch
默认情况下,Elasticsearch 会监听
localhost:9200
,你可以通过浏览器访问http://localhost:9200
来验证安装是否成功。
3.2、配置 Elasticsearch
Elasticsearch 的配置文件位于 config
目录下,主要包括 elasticsearch.yml
、jvm.options
和 log4j2.properties
。以下是一些常见的配置选项:
-
elasticsearch.yml: 这是 Elasticsearch 的主配置文件,包含了许多重要的配置选项。以下是一些常见的配置项:
-
集群名称:
javacluster.name: my-cluster
集群名称用于标识一个 Elasticsearch 集群,确保不同集群之间的节点不会混淆。
-
节点名称:
javanode.name: node-1
节点名称用于标识集群中的一个节点,方便管理和监控。
-
数据路径:
javapath.data: /var/lib/elasticsearch
数据路径指定 Elasticsearch 存储数据的目录,可以根据需要修改。
-
日志路径:
javapath.logs: /var/log/elasticsearch
日志路径指定 Elasticsearch 存储日志的目录,方便日志管理和分析。
-
网络配置:
javanetwork.host: 0.0.0.0 http.port: 9200
网络配置用于指定 Elasticsearch 监听的 IP 地址和端口,
0.0.0.0
表示监听所有网络接口。
-
-
jvm.options: 这个文件用于配置 Elasticsearch 的 JVM 参数,包括堆内存大小、垃圾回收器等。以下是一些常见的配置项:
-
堆内存大小 :
java-Xms512m -Xmx512m 堆内存大小决定了 Elasticsearch 可以使用的最大内存,建议根据服务器的内存大小进行调整。
-
-
log4j2.properties: 这个文件用于配置 Elasticsearch 的日志记录方式,包括日志级别、日志格式等。以下是一些常见的配置项:
-
日志级别 :
javalogger.action.name = org.elasticsearch.action logger.action.level = info
日志级别决定了日志的详细程度,可以根据需要调整。
-
3.3、启动与验证
完成配置后,重新启动 Elasticsearch 以应用新的配置。你可以通过以下命令启动 Elasticsearch:
bash
./bin/elasticsearch
启动后,可以通过浏览器访问 http://localhost:9200
来验证 Elasticsearch 是否正常运行。如果一切正常,你应该会看到类似以下的 JSON 响应:
java
{
"name": "node-1",
"cluster_name": "my-cluster",
"cluster_uuid": "abc123",
"version": {
"number": "7.10.0",
"build_flavor": "default",
"build_type": "tar",
"build_hash": "abc123",
"build_date": "2020-11-09T00:00:00.000Z",
"build_snapshot": false,
"lucene_version": "8.7.0",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}
通过以上步骤,你已经成功安装并配置了 Elasticsearch,可以开始进行实战应用了。
4、数据索引与文档管理
在 Elasticsearch 中,数据索引和文档管理是核心操作之一。通过索引和文档管理,可以实现数据的存储、检索和更新。以下是详细的步骤和示例代码。
4.1、创建索引
索引是 Elasticsearch 中存储数据的基本单位,类似于关系型数据库中的数据库。创建索引时,可以指定索引的名称、分片数量、副本数量等参数。
示例代码:创建索引
bash
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d' { "settings": { "number_of_shards": 3, "number_of_replicas": 2 } } '
在这个示例中,我们创建了一个名为 my_index
的索引,并指定了 3 个主分片和 2 个副本。
4.2、插入文档
文档是 Elasticsearch 中存储的基本数据单元,类似于关系型数据库中的记录。每个文档都有一个唯一的 ID,并且可以包含多个字段。
示例代码:插入文档
bash
curl -X POST "localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d' { "title": "Elasticsearch 实战", "author": "John Doe", "date": "2023-10-01" } '
在这个示例中,我们向 my_index
索引中插入了一个文档,文档的 ID 为 1
,包含 title
、author
和 date
三个字段。
4.3、更新文档
在 Elasticsearch 中,文档是不可变的,更新文档实际上是创建一个新的文档版本。可以通过 _update
API 来更新文档的部分字段。
示例代码:更新文档
bash
curl -X POST "localhost:9200/my_index/_update/1" -H 'Content-Type: application/json' -d' { "doc": { "author": "Jane Doe" } } '
在这个示例中,我们将文档 ID 为 1
的 author
字段更新为 Jane Doe
。
4.4、删除文档
删除文档是 Elasticsearch 中常见的操作之一。可以通过 _delete
API 来删除指定 ID 的文档。
示例代码:删除文档
bash
curl -X DELETE "localhost:9200/my_index/_doc/1"
在这个示例中,我们删除了 my_index
索引中 ID 为 1
的文档。
4.5、批量操作
Elasticsearch 提供了批量操作 API,可以一次性执行多个索引、更新或删除操作,提高操作效率。
示例代码:批量操作
bash
curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' -d' { "index" : { "_index" : "my_index", "_id" : "2" } } { "title" : "Elasticsearch 入门", "author" : "Alice", "date" : "2023-10-02" } { "update" : { "_index" : "my_index", "_id" : "1" } } { "doc" : { "author" : "John Smith" } } { "delete" : { "_index" : "my_index", "_id" : "2" } } '
在这个示例中,我们执行了以下操作:
- 插入一个新文档,ID 为
2
。 - 更新 ID 为
1
的文档的author
字段。 - 删除 ID 为
2
的文档。
通过以上步骤和示例代码,你可以轻松实现 Elasticsearch 中的数据索引和文档管理,为后续的搜索和分析操作打下基础。
5、搜索与查询
在 Elasticsearch 中,搜索和查询是核心功能之一。Elasticsearch 提供了丰富的查询类型和语法,可以满足各种复杂的搜索需求。以下是一些常见的搜索和查询操作。
5.1、基本查询
Elasticsearch 支持多种查询类型,包括全文搜索、结构化搜索、范围查询等。以下是一些常见的基本查询示例。
示例代码:全文搜索
bash
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "title": "Elasticsearch" } } } '
在这个示例中,我们使用 match
查询在 title
字段中搜索包含 Elasticsearch
的文档。
示例代码:结构化搜索
bash
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "term": { "author": "John Doe" } } } '
在这个示例中,我们使用 term
查询在 author
字段中精确匹配 John Doe
的文档。
示例代码:范围查询
bash
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "range": { "date": { "gte": "2023-10-01", "lte": "2023-10-31" } } } } '
在这个示例中,我们使用 range
查询在 date
字段中搜索日期范围在 2023-10-01
到 2023-10-31
之间的文档。
5.2、复合查询
Elasticsearch 支持复合查询,可以将多个查询组合在一起,实现更复杂的搜索逻辑。常见的复合查询包括 bool
查询、dis_max
查询等。
示例代码:bool 查询
bash
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "bool": { "must": [ { "match": { "title": "Elasticsearch" } }, { "term": { "author": "John Doe" } } ] } } } '
在这个示例中,我们使用 bool
查询组合了两个子查询:match
查询和 term
查询。只有同时满足这两个条件的文档才会被返回。
示例代码:dis_max 查询
bash
curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "dis_max": { "queries": [ { "match": { "title": "Elasticsearch" } }, { "match": { "content": "search engine" } } ], "tie_breaker": 0.7 } } } '
在这个示例中,我们使用 dis_max
查询组合了两个 match
查询。dis_max
查询会返回得分最高的子查询结果,并根据 tie_breaker
参数调整其他子查询的得分。
5.4、聚合查询
聚合查询是 Elasticsearch 中用于数据分析的重要功能,
Metric Aggregations
Metric Aggregations 用于计算数据的统计信息,常见的 Metric Aggregations 包括:
- Avg Aggregation:计算字段的平均值。
- Sum Aggregation:计算字段的总和。
- Max Aggregation:计算字段的最大值。
- Min Aggregation:计算字段的最小值。
- Value Count Aggregation:计算字段值的数量。
示例:计算平均值
java
{
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
示例:计算总和
java
{
"aggs": {
"total_sales": {
"sum": {
"field": "sales"
}
}
}
}
Bucket Aggregations
Bucket Aggregations 用于对数据进行分组,常见的 Bucket Aggregations 包括:
- Terms Aggregation:按字段值分组。
- Range Aggregation:按数值范围分组。
- Date Histogram Aggregation:按时间范围分组。
- Histogram Aggregation:按数值范围分组。
示例:按字段值分组
java
{
"aggs": {
"by_category": {
"terms": {
"field": "category"
}
}
}
}
示例:按数值范围分组
java
{
"aggs": {
"by_price_range": {
"range": {
"field": "price",
"ranges": [
{
"to": 50
},
{
"from": 50,
"to": 100
},
{
"from": 100
}
]
}
}
}
}
Pipeline Aggregations
Pipeline Aggregations 用于对其他聚合的结果进行进一步处理,常见的 Pipeline Aggregations 包括:
- Derivative Aggregation:计算聚合结果的导数。
- Moving Average Aggregation:计算移动平均值。
- Cumulative Sum Aggregation:计算累积和。
示例:计算移动平均值
java
{
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "date",
"interval": "month"
},
"aggs": {
"sales": {
"sum": {
"field": "sales"
}
},
"moving_avg": {
"moving_avg": {
"buckets_path": "sales"
}
}
}
}
}
}
嵌套聚合
Elasticsearch 支持嵌套聚合,即在一个聚合中嵌套另一个聚合。嵌套聚合可以用于更复杂的数据分析。
示例:按类别分组并计算每个类别的平均价格
java
{
"aggs": {
"by_category": {
"terms": {
"field": "category"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
聚合查询的实现步骤
- 定义查询:首先定义一个查询,用于过滤和选择需要分析的数据。
- 定义聚合:在查询中定义一个或多个聚合,指定聚合的类型和参数。
- 执行查询:将查询发送到 Elasticsearch,获取聚合结果。
示例:完整的聚合查询
java
{
"query": {
"match_all": {}
},
"aggs": {
"by_category": {
"terms": {
"field": "category"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
6、参考资料
- Elasticsearch 官方网站: Elastic --- The Search AI Company | Elastic
- Elasticsearch 文档: Elasticsearch Guide [8.15] | Elastic
- Elasticsearch 中文社区: 从 Elastic 社区寻求帮助 | Elastic