Elasticsearch 基础教程:从入门到实践
前言:为何需要 Elasticsearch?
在信息爆炸的时代,我们每天都在与海量数据打交道。无论是网站的搜索功能、电商平台的商品过滤、日志系统的实时分析,还是安全监控的数据聚合,都对数据的检索和分析能力提出了极高的要求。传统的数据库系统,如关系型数据库(MySQL, PostgreSQL)或 NoSQL 数据库(MongoDB, Cassandra),虽然在事务处理、结构化数据存储或键值存储方面表现出色,但在处理非结构化或半结构化数据的全文搜索、实时分析以及大规模分布式场景下,往往显得力不从心。
这时,一个强大的分布式搜索分析引擎就应运而生——它就是 Elasticsearch。
Elasticsearch 是一个基于 Apache Lucene™ 构建的开源、分布式、RESTful 搜索和分析引擎。它以其卓越的速度、可伸缩性和灵活性,在业界得到了广泛应用,成为处理搜索、日志分析、指标监控、安全情报等任务的首选工具之一。
本篇文章将带你从零开始,深入浅出地了解 Elasticsearch 的核心概念、基本操作以及如何进行简单的搜索。
第一章:核心概念解析
在深入实践之前,理解 Elasticsearch 的一些核心概念至关重要。它们构成了 Elasticsearch 的基础架构和工作原理。
-
近实时(Near Realtime, NRT): Elasticsearch 是一个近实时平台。这意味着从索引文档到可搜索之间会有一个短暂的延迟(通常在几秒钟内)。它不是一个实时系统,但对于大多数搜索和分析用例来说,这种近实时性已经足够。
-
集群(Cluster): 一个集群是由一个或多个节点组成的集合,这些节点共同持有你的全部数据,提供跨节点的索引和搜索能力。集群有一个唯一的名称(默认为
elasticsearch
),节点只有设置了相同的集群名称,才能加入该集群。这是为了避免不同环境中的节点意外加入同一个集群。 -
节点(Node): 一个节点是 Elasticsearch 集群中的一个运行实例。一个集群可以只有一个节点,也可以有多个节点。每个节点都可以通过其名称(默认是随机生成的)来识别。节点启动时,会根据配置的集群名称尝试加入或形成一个集群。节点在集群中有不同的职责,例如:
- 主节点(Master-eligible node): 负责集群的管理工作,如创建或删除索引、跟踪节点状态等。一个集群在任何时候只有一个主节点。
- 数据节点(Data node): 存储数据并执行与数据相关的操作,如CRUD(创建、读取、更新、删除)、搜索和聚合。
- 协调节点(Coordinating node): 处理来自客户端的请求,将请求路由到适当的数据节点,并收集结果。所有节点默认都是协调节点,它们能够将请求转发给正确的节点。
- 其他角色: 如Ingest Node(数据预处理)、Machine Learning Node(机器学习)等。
-
索引(Index): 索引是具有相似特征的文档集合。在关系型数据库中,这类似于一个“数据库”。在 Elasticsearch 中,数据被组织成索引。例如,你可以有一个用于存储用户数据的索引,一个用于存储产品信息的索引,或者一个用于存储日志条目的每日索引。每个索引在逻辑上都是独立的。
-
类型(Type): 在 Elasticsearch 7.x 版本及以后,一个索引中只能有一个类型
_doc
。在早期版本中,一个索引可以包含多个类型,但这已被弃用并最终移除,以简化概念和内部实现。所以现在通常一个索引对应一种类型的文档。 -
文档(Document): 文档是 Elasticsearch 中数据的最小单位。它是一个 JSON 格式的对象。在关系型数据库中,这类似于“行”。一个文档可以包含多个字段(Field),每个字段都有一个名称和一个值,值可以是字符串、数字、布尔值、日期、数组、嵌套对象等。文档是可索引的,意味着它可以被搜索。
-
字段(Field): 文档中的一个键值对。在关系型数据库中,这类似于“列”。例如,一个用户文档可能包含
name
、age
、city
等字段。 -
映射(Mapping): 映射定义了文档及其字段如何存储和索引。它类似于关系型数据库中的“表结构”。映射指定了每个字段的数据类型(如字符串、整数、日期等),以及如何对字段值进行处理(例如,一个文本字段是否需要进行全文搜索分析)。定义良好的映射对于确保搜索的准确性和效率至关重要。Elasticsearch 可以根据你索引的文档自动推断映射(动态映射),但通常建议手动定义映射(显式映射)。
-
分片(Shard): 索引可以存储大量数据,可能超过单个节点的硬件限制。为了解决这个问题,Elasticsearch 允许你将索引分解成多个分片。每个分片是一个独立的 Lucene 索引。分片是 Elasticsearch 实现分布式和可伸缩性的核心。当你创建一个索引时,可以指定主分片的数量。
- 主分片(Primary Shard): 索引数据的原始分片。文档被写入到主分片中。
- 副本分片(Replica Shard): 主分片的副本。副本分片提供了数据冗余,防止主分片丢失导致数据不可用;同时也可以处理读请求,提高搜索吞吐量。当你创建一个索引时,可以指定每个主分片对应的副本分片数量。
-
倒排索引(Inverted Index): 这是 Elasticsearch(以及 Lucene)能够快速进行全文搜索的关键。传统的数据库使用正向索引(Document -> Terms),而倒排索引则是一个词项(Term)到包含该词项的文档列表的映射(Term -> Documents)。例如,对于两篇文档 “The quick brown fox” 和 “The slow brown dog”,倒排索引可能看起来像这样:
the
: [Doc 1, Doc 2]quick
: [Doc 1]brown
: [Doc 1, Doc 2]fox
: [Doc 1]slow
: [Doc 2]dog
: [Doc 2]
当搜索 “quick brown” 时,Elasticsearch 查找包含 “quick” 的文档 ([Doc 1]) 和包含 “brown” 的文档 ([Doc 1, Doc 2]),然后合并结果并计算相关性得分。
-
分析(Analysis): 分析是将文本处理成适合索引或搜索的词项(terms)的过程。它涉及三个阶段:
- 字符过滤器(Character Filters): 在文本被分词器处理之前,对文本进行处理,如去除 HTML 标签、替换特殊字符等。
- 分词器(Tokenizer): 将文本分割成独立的词项。例如,标准分词器(standard tokenizer)会根据空格和标点符号分割文本。
- 词项过滤器(Token Filters): 对分词器产生的词项进行进一步处理,如将词项转为小写、去除停用词(如”the”, “a”等)、词干提取(如将”running”变为”run”)等。
分析过程对于全文搜索的相关性和准确性至关重要。
理解了这些核心概念,我们就有了探索 Elasticsearch 的基础。
第二章:安装与启动
要开始使用 Elasticsearch,你需要先安装它。有几种常见的安装方式:
- 通过软件包管理器: 在 Linux 系统上,你可以使用 APT 或 YUM 安装。
- 下载二进制包: 从 Elasticsearch 官方网站下载压缩包,解压后即可运行。
- 使用 Docker: 这是最便捷的方式之一,特别是对于开发和测试环境。
- 使用 Elastic Cloud: Elastic 官方提供的云服务,无需安装和管理。
这里我们以使用 Docker 为例,因为它跨平台且易于隔离环境。
使用 Docker 安装 Elasticsearch 和 Kibana:
通常,你会将 Elasticsearch 与 Kibana 一起使用,Kibana 是 Elastic Stack 的数据可视化和管理工具,提供了一个方便的 Web UI 和开发者控制台。
首先,确保你已经安装了 Docker 和 Docker Compose。
创建一个名为 docker-compose.yml
的文件,内容如下:
“`yaml
version: ‘3.8’
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0 # 使用稳定版本
container_name: elasticsearch
environment:
– discovery.type=single-node # 开发模式,单节点
– ES_JAVA_OPTS=-Xms512m -Xmx512m # 设置堆内存,根据实际情况调整
– xpack.security.enabled=false # 暂时禁用安全,方便初学
– xpack.monitoring.collection.enabled=true
ports:
– “9200:9200” # HTTP API 端口
– “9300:9300” # 节点间通信端口
volumes:
– esdata:/usr/share/elasticsearch/data # 数据卷,持久化数据
networks:
– elastic-net
kibana:
image: docker.elastic.co/kibana/kibana:7.17.0 # 确保版本与 Elasticsearch 匹配
container_name: kibana
environment:
– ELASTICSEARCH_HOSTS=http://elasticsearch:9200 # 连接 Elasticsearch
ports:
– “5601:5601” # Kibana Web UI 端口
depends_on:
– elasticsearch # 确保 Elasticsearch 先启动
networks:
– elastic-net
volumes:
esdata:
networks:
elastic-net:
driver: bridge
“`
保存文件后,在终端中切换到该文件所在的目录,运行:
bash
docker-compose up -d
这将下载镜像(如果本地没有)、创建并启动 elasticsearch 和 kibana 容器。-d
参数让容器在后台运行。
等待几分钟,直到容器启动完毕。你可以通过访问 http://localhost:9200
来检查 Elasticsearch 是否运行正常。如果看到一个 JSON 响应,说明 Elasticsearch 已经成功启动。
同时,访问 http://localhost:5601
打开 Kibana Web UI。在 Kibana 中,你可以使用 Dev Tools(开发者工具)来发送 Elasticsearch API 请求,这比 cURL 命令行工具更加友好。
第三章:基本 CRUD 操作 (创建、读取、更新、删除)
Elasticsearch 提供了一个 RESTful API 来进行操作。你可以使用任何可以发送 HTTP 请求的工具(如 cURL、Postman、Kibana Dev Tools)与它交互。在 Kibana 的 Dev Tools 中,你可以直接输入请求体,然后点击发送。Dev Tools 会自动为你加上 _cluster/health
等命令前的 GET
, POST
, PUT
, DELETE
请求方法。
索引文档 (Create/Index)
将数据存储到 Elasticsearch 中称为“索引文档”。
方式 1:手动指定文档 ID
使用 PUT
请求指定索引名称、_doc
(文档类型)和文档 ID。
json
PUT /my_index_01/_doc/1
{
"title": "Elasticsearch Tutorial",
"author": "张三",
"publish_date": "2023-10-26",
"content": "This is a basic tutorial for Elasticsearch.",
"views": 100
}
my_index_01
: 索引的名称。_doc
: 文档类型(在 7.x+ 版本中通常是_doc
)。1
: 文档的唯一 ID。- 请求体:JSON 格式的文档内容。
如果文档 ID 为 1
在 my_index_01
索引中不存在,则创建该文档;如果存在,则替换(更新)该文档。
方式 2:自动生成文档 ID
使用 POST
请求,Elasticsearch 会自动为你生成一个唯一的文档 ID。
json
POST /my_index_01/_doc
{
"title": "Another Document",
"author": "李四",
"publish_date": "2023-10-27",
"content": "Elasticsearch automatically generates IDs.",
"tags": ["elasticsearch", "tutorial"]
}
响应会包含新创建文档的 _index
, _type
, _id
和 _version
。
获取文档 (Read/Get)
通过指定的索引名称、类型和文档 ID 获取文档。
json
GET /my_index_01/_doc/1
响应会包含文档的元信息(_index
, _type
, _id
, _version
, _seq_no
, _primary_term
)以及存储的文档内容(在 _source
字段中)。如果文档不存在,会返回 404 错误。
更新文档 (Update)
你可以替换整个文档,或者只更新文档的一部分字段。
方式 1:替换整个文档 (PUT)
使用 PUT
方法和已存在的文档 ID 索引一个新文档,会完全替换旧文档。
json
PUT /my_index_01/_doc/1
{
"title": "Elasticsearch Tutorial (Updated)",
"author": "张三",
"publish_date": "2023-10-26",
"content": "This tutorial is updated now.",
"views": 120,
"status": "published"
}
这将完全替换 ID 为 1
的文档,即使你只修改了 content
和 views
字段。新文档中未包含的旧字段将被删除。
方式 2:局部更新文档 (POST _update)
使用 POST
方法和 _update
端点可以实现局部更新,只修改指定的字段,而不影响其他字段。
json
POST /my_index_01/_update/1
{
"doc": {
"views": 150,
"status": "published"
}
}
这里只更新了 views
和 status
字段,title
, author
, publish_date
, content
等字段会保留。
你也可以使用脚本进行更复杂的更新操作,例如对某个数值字段进行递增。
json
POST /my_index_01/_update/1
{
"script": {
"source": "ctx._source.views += params.count",
"lang": "painless",
"params": {
"count": 5
}
}
}
这个脚本会将 views
字段的值增加 5。
删除文档 (Delete)
通过指定的索引名称、类型和文档 ID 删除文档。
json
DELETE /my_index_01/_doc/1
响应会告诉你文档是否找到以及是否成功删除。
批量操作 (_bulk)
实际应用中,为了提高效率,我们通常会进行批量操作(索引、更新、删除)。Elasticsearch 提供了 _bulk
API 来支持这一需求。
_bulk
API 接收一个由多个 JSON 对象组成的请求体,每个 JSON 对象描述一个操作(index
, create
, update
, delete
)及其相关的元数据(如 _index
, _id
),后面紧跟着(如果是 index
或 update
操作)文档本身或更新请求体。
请求体格式:
json
action_and_metadata\n
[optional_document]\n
action_and_metadata\n
[optional_document]\n
...
注意:每个 JSON 对象后面必须紧跟一个换行符 \n
,包括请求体的最后一行。
示例:批量索引和删除
json
POST _bulk
{"index": {"_index": "my_index_01", "_id": "3"}}
{"title": "Doc 3", "content": "Content for doc 3"}
{"create": {"_index": "my_index_01", "_id": "4"}}
{"title": "Doc 4", "content": "Content for doc 4"}
{"delete": {"_index": "my_index_01", "_id": "2"}}
{"update": {"_index": "my_index_01", "_id": "3"}}
{"doc": {"views": 200}}
_bulk
API 是一个原子操作吗?不是。_bulk
API 会按顺序处理每个操作,并记录每个操作的结果。如果其中一个操作失败,并不会影响其他操作的执行。
第四章:基本搜索
搜索是 Elasticsearch 的核心功能。你可以执行非常灵活和强大的搜索查询。基本的搜索请求是向 _search
端点发送 GET
或 POST
请求。通常使用 POST
请求,因为搜索请求体可能比较大。
简单的 URI 搜索
最简单的搜索方式是通过请求 URI 参数指定查询字符串。这适用于快速测试或简单的查询。
json
GET /my_index_01/_search?q=tutorial
这个请求会在 my_index_01
索引的所有字段中搜索包含词项 “tutorial” 的文档。
json
GET /my_index_01/_search?q=author:张三
这个请求会在 my_index_01
索引的 author
字段中搜索包含词项 “张三” 的文档。
虽然 URI 搜索简单,但功能有限,不能表达复杂的查询逻辑。更强大和灵活的方式是使用请求体进行搜索,这被称为 Query DSL (Domain Specific Language)。
使用 Query DSL 进行搜索
Query DSL 是一个基于 JSON 的 DSL,提供了丰富的查询类型和组合方式。搜索请求体通常包含一个 query
字段,内部定义具体的查询逻辑。
基本结构:
json
GET /my_index_01/_search
{
"query": {
// 这里定义查询逻辑
}
}
常用查询类型:
-
Match Query: 全文搜索的标准查询。它会分析(Analysis)查询字符串,并匹配字段中经过分析后的词项。
json
GET /my_index_01/_search
{
"query": {
"match": {
"content": "basic tutorial"
}
}
}
这个查询会在content
字段中搜索包含 “basic” 或 “tutorial” 词项的文档(取决于分析器,通常是或的关系)。 -
Term Query: 精确值匹配查询。它不会分析查询字符串。常用于精确匹配数字、日期、布尔值或未经分析的字符串(
keyword
类型)。json
GET /my_index_01/_search
{
"query": {
"term": {
"views": 150
}
}
}
这个查询会查找views
字段值精确等于 150 的文档。
重要:term
查询不适用于text
类型的字段,因为text
字段的值会被分析成多个词项存储,而term
查询不会分析查询字符串。如果你对text
字段使用term
查询,它会尝试查找精确匹配整个原始字符串的词项,这通常不会有结果。 -
Bool Query: 组合多个查询子句。它有四种类型的子句:
must
: 子句必须匹配,文档会计算相关性得分。filter
: 子句必须匹配,但文档不计算相关性得分(常用于过滤,性能更好)。should
: 子句应该匹配,至少一个should
子句匹配即可,文档会计算相关性得分。must_not
: 子句不能匹配,文档不计算相关性得分。
json
GET /my_index_01/_search
{
"query": {
"bool": {
"must": [
{ "match": { "content": "tutorial" } }
],
"filter": [
{ "term": { "author.keyword": "张三" } } // 假设author字段有keyword子字段
],
"must_not": [
{ "term": { "status": "draft" } }
]
}
}
}
这个查询会查找内容包含 “tutorial” 且作者是 “张三”(精确匹配),同时状态不是 “draft” 的文档。注意这里使用了author.keyword
,这是因为text
字段默认会创建一个同名的keyword
子字段,用于精确匹配。 -
Match Phrase Query: 短语匹配查询。它要求查询字符串中的词项以相同的顺序且彼此相邻地出现在字段中。
json
GET /my_index_01/_search
{
"query": {
"match_phrase": {
"content": "basic tutorial"
}
}
}
这个查询会查找content
字段中精确包含短语 “basic tutorial” 的文档。 -
Range Query: 查找字段值在某个范围内的文档。常用于数字和日期字段。
json
GET /my_index_01/_search
{
"query": {
"range": {
"views": {
"gte": 100, // 大于等于
"lt": 200 // 小于
}
}
}
}
查找views
字段值大于等于 100 且小于 200 的文档。
日期范围查询:
json
GET /my_index_01/_search
{
"query": {
"range": {
"publish_date": {
"gte": "2023-10-01",
"lte": "now/d" // 当前日期午夜
}
}
}
}
查找发布日期在 2023-10-01 到今天之间的文档。
搜索结果的控制
搜索请求体中除了 query
外,还可以包含其他参数来控制搜索结果:
-
size
和from
: 用于分页。size
指定返回的文档数量,from
指定从哪个文档开始返回(偏移量)。
json
GET /my_index_01/_search
{
"query": { "match_all": {} }, // match_all 匹配所有文档
"from": 10,
"size": 5
}
获取第 11 到 15 条文档。 -
_source
: 控制返回的文档源字段。默认为true
,返回整个_source
对象。你可以指定只返回部分字段或完全不返回源字段。json
GET /my_index_01/_search
{
"query": { "match_all": {} },
"_source": ["title", "author"] // 只返回 title 和 author 字段
}
或者不返回任何源字段:
json
GET /my_index_01/_search
{
"query": { "match_all": {} },
"_source": false
}
当只需要文档的元信息(如 ID)而不需要文档内容时,这可以提高性能。 -
sort
: 对搜索结果进行排序。json
GET /my_index_01/_search
{
"query": { "match": { "content": "tutorial" } },
"sort": [
{ "publish_date": { "order": "desc" } }, // 按发布日期降序
{ "views": { "order": "desc" } } // 再按浏览量降序
]
}
默认排序是按相关性得分(_score
)降序。
理解 Query DSL 是掌握 Elasticsearch 搜索的关键。通过组合不同的查询类型,你可以构建非常复杂的搜索逻辑。
第五章:映射(Mapping)简介
映射定义了文档中的字段如何被索引和存储。它告诉 Elasticsearch 关于每个字段的类型(如 text
, keyword
, date
, long
, double
, boolean
, object
等)以及如何处理这些字段的值。
动态映射(Dynamic Mapping)
当你索引一个新文档到一个以前没有该字段的索引时,Elasticsearch 会尝试根据字段值的 JSON 类型来猜测字段的类型,并自动添加该字段到索引的映射中。这就是动态映射。
例如,当你索引第一个文档:
json
PUT /my_index_02/_doc/1
{
"message": "Hello Elasticsearch!",
"timestamp": "2023-10-27T10:00:00Z",
"count": 10,
"enabled": true
}
Elasticsearch 可能会自动创建一个映射:
json
{
"my_index_02": {
"mappings": {
"properties": {
"message": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } },
"timestamp": { "type": "date" },
"count": { "type": "long" },
"enabled": { "type": "boolean" }
}
}
}
}
你可以通过 GET /my_index_02/_mapping
查看索引的映射。
动态映射方便快捷,特别是对于不确定字段结构的日志数据。然而,它可能不总是猜对你想要的类型,或者你可能需要更精确的控制(如使用特定的分析器)。
显式映射(Explicit Mapping)
为了更精确地控制字段的索引方式,建议手动创建或更新索引的映射。
在创建索引时定义映射:
json
PUT /my_index_03
{
"settings": {
"number_of_shards": 1, # 1个主分片
"number_of_replicas": 1 # 1个副本分片
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard" # 使用标准分析器
},
"tags": {
"type": "keyword" # 精确匹配,不分析
},
"price": {
"type": "float"
},
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" # 支持多种日期格式
},
"is_published": {
"type": "boolean"
},
"location": {
"type": "geo_point" # 地理位置类型
}
}
}
}
当你需要添加新的字段到现有映射时,可以通过 PUT _mapping
端点更新映射。但注意:大多数现有字段的映射一旦创建就不能修改(尤其是从 text
改为 keyword
或反之,或改变分析器),因为这会影响底层 Lucene 索引的结构。如果需要修改,通常的做法是重新索引数据到一个新的索引。
Text vs Keyword
这是初学者最容易混淆的地方。
text
类型: 用于需要进行全文搜索的字符串字段(如文章内容、产品描述)。字段值会被分析器处理成多个词项,并存储在倒排索引中。搜索时使用match
等查询类型,会进行分析。keyword
类型: 用于需要精确匹配的字符串字段(如标签、状态、国家代码、邮箱地址)。字段值会被作为一个单独的词项存储,不进行分析。搜索时使用term
等查询类型。
很多时候,一个字段可能既需要全文搜索(如产品名称),又需要精确匹配(如按完整的名称过滤)。这时可以在映射中给 text
字段添加一个 keyword
子字段:
json
PUT /products
{
"mappings": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256 # 超过指定长度的字符串不索引为keyword,节省空间
}
}
}
}
}
}
索引包含 name
字段的文档后,你可以对 name
字段进行全文搜索(match
),也可以对 name.keyword
字段进行精确匹配(term
)。
第六章:Kibana Dev Tools 的使用
如前所述,Kibana 的 Dev Tools (开发者工具) 是一个非常方便的与 Elasticsearch 交互的工具。它提供了一个控制台界面,你可以在其中输入 Elasticsearch API 请求,并查看响应结果。
在 Kibana 中,点击左侧导航栏的 “Dev Tools” 或 “Management” 下的 “Dev Tools”。
控制台界面分为左右两栏:左侧输入请求,右侧显示响应。你可以输入完整的 HTTP 请求,例如:
GET /_cat/indices?v
或者只输入 API 路径和请求体,Dev Tools 会自动识别请求方法(GET, POST, PUT, DELETE):
PUT /my_index_04
{
"settings": {
"number_of_shards": 1
}
}
输入完成后,点击请求旁边的绿色播放按钮即可发送请求。Dev Tools 支持多行请求,并且可以同时发送多个请求块(用空行分隔)。
Dev Tools 还提供了语法高亮、自动完成和历史记录等功能,极大地提高了开发效率。强烈建议在学习和实践过程中多使用 Dev Tools。
第七章:超越基础:进一步学习方向
本教程涵盖了 Elasticsearch 的核心概念、基本的 CRUD 操作、Query DSL 搜索以及映射的基础。但这仅仅是冰山一角。Elasticsearch 还有许多强大且重要的功能等待你去探索:
- 聚合(Aggregations): Elasticsearch 最强大的分析功能之一。用于对搜索结果进行分组和计算统计指标(如计数、求和、平均值、最大值、最小值、分组统计等)。例如,统计每个作者的文档数量、计算某个时间段内的总浏览量等。
- 分析器(Analyzers): 自定义文本分析过程,以优化搜索结果的相关性。可以组合不同的字符过滤器、分词器和词项过滤器来满足特定的语言或业务需求。
- 更高级的查询: 如
constant_score
(不计算相关性得分)、function_score
(自定义相关性得分)、more_like_this
(查找相似文档) 等。 - 索引模板(Index Templates): 定义新创建索引的默认设置和映射,方便管理和统一配置。
- 生命周期管理(Index Lifecycle Management, ILM): 自动化管理索引的生命周期,包括rollover(滚动)、shrink(收缩)、force merge(强制合并)、delete(删除)等操作,常用于时间序列数据(如日志)。
- 数据流(Data Streams): 用于处理时间序列数据,简化 ILM 的使用和索引管理。
- 跨集群搜索(Cross-Cluster Search, CCS): 在不同集群之间进行搜索。
- 安全(Security): 用户认证、授权、加密通信等。
- 监控与告警(Monitoring and Alerting): 使用 Metricbeat, Auditbeat 等 Beats 工具收集集群指标,在 Kibana 中监控集群健康状况,并设置告警规则。
- 集群管理: 主节点选举、故障转移、扩容等。
结论
Elasticsearch 是一个功能强大、灵活且可伸缩的分布式搜索和分析引擎。通过本教程,你应该对 Elasticsearch 的核心概念有了清晰的认识,并掌握了如何安装、进行基本的 CRUD 操作和使用 Query DSL 进行搜索。
理解 Elasticsearch 的分布式特性、倒排索引原理、映射和分析过程,是有效利用它的基础。Kibana 的 Dev Tools 是你学习和实践过程中的得力助手。
Elasticsearch 的世界非常广阔,还有许多高级特性等待你去探索。最好的学习方法是动手实践:安装它,索引你的数据,尝试不同的搜索查询和聚合。随着实践的深入,你将越来越熟练地运用 Elasticsearch 来解决复杂的搜索和分析问题。
祝你探索愉快!