Elasticsearch 零基础入门教程:迈出分布式搜索与分析的第一步
引言:告别传统数据库的搜索瓶颈
在信息爆炸的时代,数据的增长速度远超我们的想象。无论是网站的内容、应用的日志、电商的产品目录,还是社交媒体的动态,我们都需要高效地存储、检索和分析这些海量数据。
传统的数据库(如MySQL、PostgreSQL等关系型数据库)在处理结构化数据方面表现出色,但在面对非结构化或半结构化数据,特别是需要进行全文搜索(Full-text Search)时,往往显得力不从心。想象一下,在一个有数百万篇博客文章的数据库中搜索包含特定词语的段落,传统数据库可能需要进行全表扫描或依赖复杂的 LIKE 查询和索引,效率低下且难以扩展。
这时,我们就需要更专业的工具。而Elasticsearch正是为解决这类问题而生。
Elasticsearch 是一个基于 Lucene 的开源分布式搜索和分析引擎。它可以近乎实时地存储、检索和分析大量数据。它被广泛应用于:
- 全文搜索: 如电商网站的商品搜索、文档管理系统的文档搜索。
- 日志分析: 配合 Logstash 和 Kibana(合称 ELK Stack),用于收集、分析和可视化服务器日志、应用日志等。
- 性能监控: 配合 Beats 和 Kibana(合称 ECK Stack 的一部分),用于收集系统指标、APM 数据等。
- 地理位置搜索: 存储和查询地理位置信息。
- 数据分析和可视化: 通过强大的聚合功能进行数据统计和钻取,并在 Kibana 中展示。
简单来说,Elasticsearch 就像是一个极速的、可以处理各种文本内容、并且天生支持分布式的数据库,特别擅长“搜索”和“分析”。
本教程将带领完全没有接触过 Elasticsearch 的你,从零开始了解它的核心概念,学会如何安装、启动,以及执行最基本的数据操作和搜索。
第一章:环境搭建——让Elasticsearch跑起来
要开始学习 Elasticsearch,首先需要在你的电脑上安装并运行它。
1. 前置条件:Java 环境
Elasticsearch 是基于 Java 开发的,因此你需要先安装 Java Development Kit (JDK),推荐使用 Oracle JDK 或 OpenJDK,版本建议是 Elasticsearch 兼容的 LTS 版本(如 Java 8 或 Java 11,具体取决于你下载的 Elasticsearch 版本要求)。
- 检查 Java 版本: 打开命令行工具(Windows 是 cmd 或 PowerShell,macOS/Linux 是 Terminal),输入
java -version
。如果显示版本信息,说明已安装。 - 安装 Java: 如果未安装,请前往 Oracle 或 OpenJDK 官网下载并安装适合你操作系统的 JDK 版本。安装完成后,可能需要配置
JAVA_HOME
环境变量。这部分内容可以参考 Java 相关的安装教程。
2. 下载 Elasticsearch
访问 Elasticsearch 官方下载页面:https://www.elastic.co/cn/downloads/elasticsearch
选择适合你操作系统的版本进行下载。对于初学者,建议下载最新稳定版。你可以选择 .zip
(Windows) 或 .tar.gz
(macOS/Linux) 压缩包。
3. 安装与启动
下载完成后,将压缩包解压到一个你喜欢的目录。例如,解压到 C:\elasticsearch-x.y.z
(Windows) 或 /usr/local/elasticsearch-x.y.z
(macOS/Linux)。这里的 x.y.z
代表版本号。
- Windows:
- 打开解压后的文件夹,找到
bin
目录。 - 双击运行
elasticsearch.bat
文件。
- 打开解压后的文件夹,找到
- macOS/Linux:
- 打开 Terminal,进入解压后的文件夹目录。
- 切换到
bin
目录:cd bin
- 运行 Elasticsearch:
./elasticsearch
启动过程会输出大量日志信息。当你在日志中看到类似 दिसते Cluster state updated
或 started
等信息,并且没有错误提示时,说明 Elasticsearch 已经成功启动并在后台运行了。默认情况下,它运行在 localhost:9200
端口。
4. 验证安装
Elasticsearch 提供了一套强大的 RESTful API,我们可以通过发送 HTTP 请求来与其交互。最简单的方式是使用浏览器或命令行工具(如 cURL)访问其默认端口。
-
使用浏览器: 打开浏览器,访问
http://localhost:9200
。如果一切正常,你应该会看到一个 JSON 格式的响应,包含 Elasticsearch 集群的信息,例如:json
{
"name" : "your-node-name",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "...",
"version" : {
"number" : "x.y.z",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "...",
"build_date" : "...",
"build_snapshot" : false,
"lucene_version" : "...",
"minimum_wire_compatibility_version" : "...",
"minimum_index_compatibility_version" : "..."
},
"tagline" : "You Know, for Search"
} -
使用 cURL (macOS/Linux 通常自带,Windows 10+ 也自带): 打开命令行工具,输入
curl http://localhost:9200
。你也会看到类似的 JSON 输出。
看到这些信息,恭喜你!Elasticsearch 已经在你的机器上成功运行起来了。
5. 安装 Kibana (推荐)
虽然可以通过 cURL 等工具与 Elasticsearch 交互,但对于初学者来说,使用 Kibana(Elasticsearch 的官方配套可视化工具)会极大地降低学习曲线。Kibana 提供了一个叫做 Dev Tools (开发工具) 的界面,可以直接发送 Elasticsearch API 请求,并格式化显示结果,非常方便。
- 下载 Kibana: 访问 Kibana 官方下载页面:https://www.elastic.co/cn/downloads/kibana。下载与你安装的 Elasticsearch 版本一致的 Kibana。
- 安装与启动: 解压下载的压缩包。
- Windows: 进入解压目录的
bin
文件夹,双击运行kibana.bat
。 - macOS/Linux: 进入解压目录的
bin
文件夹,在 Terminal 中运行./kibana
。
- Windows: 进入解压目录的
- 访问 Kibana: 启动成功后,打开浏览器访问
http://localhost:5601
(Kibana 默认端口)。 - 使用 Dev Tools: 在 Kibana 界面的左侧导航栏中找到并点击 “Management” 或 “Dev Tools” (不同版本位置可能略有差异)。进入 Dev Tools 后,你会在左侧看到一个编辑器面板,右侧是结果面板。你可以在左侧输入 Elasticsearch API 命令,然后点击绿色的播放按钮执行。
注意: 在 Dev Tools 中发送 API 请求时,你无需输入 curl -X
和 http://localhost:9200
部分。例如,要查看集群信息,只需输入 GET /
然后执行。
在本教程后续的章节中,我们将主要使用 Kibana 的 Dev Tools 来演示操作。
第二章:核心概念——理解Elasticsearch的基石
在开始操作之前,理解 Elasticsearch 的一些核心概念至关重要。为了方便理解,我们将它们与传统数据库的概念进行类比,但请记住,这只是为了入门方便,Elasticsearch 的内部机制与传统数据库有很大不同。
Elasticsearch | 传统数据库类比 | 说明 |
---|---|---|
Cluster | 数据库集群/实例 | 由一个或多个节点组成的集合,共同存储所有数据并提供索引和搜索能力。 |
Node | 数据库服务器 | 一个 Elasticsearch 实例,是集群中的一个成员。 |
Index | 数据库 (Database) | 存储类似特征文档的集合。例如,你可以有一个用户索引、一个产品索引。一个集群可以有多个索引。 |
Type | 表 (Table) | 【重要:已弃用/移除】 在早期版本中,一个索引下可以有多个 Type。现在,一个索引通常只包含一种类型的文档。新版本已完全移除 Type 的概念,直接在 Index 中存储文档。为了兼容旧概念或理解历史资料,了解它曾存在即可。本教程后续将忽略 Type。 |
Document | 行 (Row) | 可以被索引的基本信息单元。通常是 JSON 格式的数据。 |
Field | 列 (Column) | Document 中的键值对,例如 name , age , content 等。 |
Mapping | 表结构/模式 (Schema) | 定义 Index 中 Document 的字段类型、如何分词、如何索引等属性。类似于数据库的表结构定义,但更灵活(支持动态映射)。 |
Shard | 分区 (Partition) | Index 的物理分片。一个 Index 可以被分成多个 Shards,分布在不同的节点上,实现分布式存储和并行搜索。 |
Replica | 副本 (Replica) | Shard 的复制。提供数据冗余以提高可用性和读取性能。 |
关键点:
- Index (索引): 是 Elasticsearch 中最重要的概念之一。它是存储具有相似结构或目的文档的集合。例如,你可以创建一个
blogs
索引来存储所有博客文章,或者一个products
索引来存储所有商品信息。索引的名字必须是小写。 - Document (文档): 是 Elasticsearch 中可搜索的最小单元。一个文档可以看作是 JSON 格式的数据结构。例如,一篇博客文章就是一个文档,一个用户信息也是一个文档。每个文档都有一个唯一的 ID。
- Mapping (映射): 描述了索引中的文档可能包含哪些字段,以及每个字段的数据类型(如字符串、数字、日期、布尔值、地理位置等)。Mapping 还定义了 Elasticsearch 如何处理这些字段的值,特别是如何对文本字段进行分析 (Analysis) 以便进行全文搜索。
理解了这些概念,我们就可以开始实际操作了。
第三章:基本操作——CRUD (创建、读取、更新、删除)
我们将使用 Kibana 的 Dev Tools 来演示这些基本操作。在 Dev Tools 的左侧面板输入以下命令,然后点击执行。
1. 创建 (索引) 文档 – Indexing Documents
将文档存储到 Elasticsearch 中称为“索引”文档。有两种主要方式:
-
方式一:指定文档 ID (
PUT
)
如果你知道文档的唯一标识符,可以使用PUT
方法并指定 ID。json
PUT /my_index/_doc/1
{
"title": "Elasticsearch 入门指南",
"author": "张三",
"publish_date": "2023-10-26",
"content": "这是一篇详细的 Elasticsearch 入门教程,适合零基础学习者。"
}
*PUT
: HTTP 方法。
*/my_index
: 索引的名称。如果my_index
不存在,Elasticsearch 会自动创建它。
*/_doc
: 这是端点,表示我们要索引一个文档。
*/1
: 文档的唯一 ID。
* 下面的 JSON 是文档的内容。执行后,右侧结果面板会显示响应,类似:
json
{
"_index": "my_index",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
"result": "created"
表示文档已成功创建。 -
方式二:自动生成文档 ID (
POST
)
如果你没有一个现成的唯一 ID,可以让 Elasticsearch 自动生成。使用POST
方法,并且不指定 ID。json
POST /my_index/_doc
{
"title": "分布式搜索的魅力",
"author": "李四",
"publish_date": "2023-10-27",
"content": "了解分布式搜索如何处理海量数据,提升搜索效率。"
}
执行后,结果会类似:json
{
"_index": "my_index",
"_id": "...", // 这里是 Elasticsearch 自动生成的 ID
"_version": 1,
"result": "created",
"_shards": { ... },
"_seq_no": ...,
"_primary_term": ...
}
注意这里的_id
是 Elasticsearch 自动生成的一串字符。
2. 读取文档 – Getting Documents
通过文档的 ID,我们可以精确地获取某个文档的内容。
json
GET /my_index/_doc/1
* GET
: HTTP 方法。
* /my_index/_doc/1
: 指定要获取的索引名和文档 ID。
执行后,结果面板会显示文档的详细信息:
json
{
"_index": "my_index",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true, // 表示找到了文档
"_source": { // 文档的原始内容
"title": "Elasticsearch 入门指南",
"author": "张三",
"publish_date": "2023-10-26",
"content": "这是一篇详细的 Elasticsearch 入门教程,适合零基础学习者。"
}
}
如果你尝试获取一个不存在的文档 ID,"found"
会是 false
,并且没有 _source
字段。
3. 更新文档 – Updating Documents
更新文档通常不是简单地替换整个文档,而是对部分字段进行修改。使用 POST /_update/<_id>
端点,并在请求体中使用 doc
字段指定要修改的部分。
json
POST /my_index/_update/1
{
"doc": {
"author": "张三丰", // 修改作者字段
"views": 100 // 添加一个新字段 views
}
}
* POST
: HTTP 方法。
* /my_index/_update/1
: 指定要更新的索引名和文档 ID。
* "doc": { ... }
: 包含要更新或添加的字段。
执行后,结果会显示 "result": "updated"
,并且 _version
会增加(从 1 变成 2)。
你可以再次使用 GET /my_index/_doc/1
来验证更新后的文档内容。
4. 删除文档 – Deleting Documents
删除某个文档也很简单,使用 DELETE
方法。
json
DELETE /my_index/_doc/1
* DELETE
: HTTP 方法。
* /my_index/_doc/1
: 指定要删除的索引名和文档 ID。
执行后,结果会显示 "result": "deleted"
。再次尝试 GET /my_index/_doc/1
会发现 "found": false
。
5. 批量操作 – Bulk Operations (了解)
在实际应用中,我们通常需要一次性索引、更新或删除多个文档,而不是一个一个地操作。Elasticsearch 提供了 _bulk
API 来高效地执行批量操作。
json
POST /_bulk
{ "index": { "_index": "my_index", "_id": "3" } }
{ "title": "第三篇文章", "author": "王五", "content": "批量操作演示1" }
{ "create": { "_index": "my_index", "_id": "4" } }
{ "title": "第四篇文章", "author": "赵六", "content": "批量操作演示2" }
{ "delete": { "_index": "my_index", "_id": "2" } } // 假设 ID 为 2 的文档存在
{ "update": { "_index": "my_index", "_id": "3" } }
{ "doc": { "views": 50 } }
_bulk
API 的格式比较特殊,每一行是一个操作(index
, create
, delete
, update
),下一行是操作对应的数据(对于 delete
操作则不需要数据行)。注意操作行和数据行之间没有逗号,但每一行都以换行符结束。
批量操作是提高效率的重要手段,但在初学阶段,掌握单个文档的 CRUD 就足够了。
第四章:强大的搜索——Elasticsearch的核心价值
CRUD 操作只是基础,Elasticsearch 真正的强大之处在于它的搜索能力。与传统数据库的 SQL 查询不同,Elasticsearch 使用自己的 Query DSL (Domain Specific Language),这是一套基于 JSON 的查询语言,非常灵活和强大。
所有的搜索请求都发送到 /<index>/_search
或 /_search
(搜索所有索引) 端点,使用 GET
或 POST
方法(POST
更常用,因为查询体在请求体中)。
json
GET /my_index/_search
{
"query": {
// 在这里编写查询条件
}
}
让我们来学习一些基本的搜索查询类型。
1. 匹配所有文档 – match_all
Query
这是最简单的查询,返回索引中的所有文档(受分页限制)。
json
GET /my_index/_search
{
"query": {
"match_all": {}
}
}
结果会显示一个 hits
数组,其中包含匹配到的文档信息。
2. 字段精确匹配 – term
Query
term
查询用于查找在指定字段中包含精确词语(term)的文档。这里的“精确”非常重要,它不会对查询词进行分词处理。term
查询通常用于非文本字段(如数字、日期、布尔值或标记为 keyword
类型的文本字段)。
假设我们想查找作者恰好是“张三丰”的文档(注意,这要求作者字段未被分词)。
json
GET /my_index/_search
{
"query": {
"term": {
"author": "张三丰"
}
}
}
如果 author
字段是 text
类型并使用了标准分词器,“张三丰”可能会被分词。为了让 term
查询生效,需要确保字段是 keyword
类型或使用 text
类型的 .keyword
子字段。我们将在下一章讨论 Mapping。
3. 全文搜索 – match
Query
match
查询是进行全文搜索的核心。它会对查询词进行分词处理,然后查找在指定字段中包含任意分词结果的文档。这使得我们可以搜索包含某个词语、词组甚至句子的文档,而不用关心词语的精确位置。
假设我们想搜索 content
字段中包含“教程”这个词的文档。
json
GET /my_index/_search
{
"query": {
"match": {
"content": "教程"
}
}
}
Elasticsearch 会对“教程”进行分词(例如,中文标准分词器可能将其视为一个词),然后在 content
字段的倒排索引中查找包含该词的文档。
再例如,搜索“入门指南”。
json
GET /my_index/_search
{
"query": {
"match": {
"title": "入门指南"
}
}
}
match
查询非常灵活,它还支持运算符(如 AND
, OR
)来控制匹配逻辑。
4. 复合查询 – bool
Query
bool
查询允许我们将多个查询子句组合在一起,形成更复杂的逻辑。它有四种类型的子句:
must
: 子句必须匹配,用于计算得分。相当于 SQL 的AND
。filter
: 子句必须匹配,但不用于计算得分。结果可以被缓存,效率更高。适合用于过滤条件。相当于 SQL 的WHERE
子句。should
: 子句应该匹配。如果没有任何must
子句,至少一个should
子句必须匹配。用于影响得分,增加相关性。相当于 SQL 的OR
。must_not
: 子句不能匹配。不用于计算得分。相当于 SQL 的NOT
。
例子:查找作者是“张三丰”且内容包含“教程”的文档。
json
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{ "term": { "author.keyword": "张三丰" } }, // 假设 author 有 keyword 子字段
{ "match": { "content": "教程" } }
]
}
}
}
注意:为了让 term
查询作者精确匹配,我们使用了 author.keyword
。这将在下一章详细解释。
例子:查找内容包含“教程”或“分布式”的文档。
json
GET /my_index/_search
{
"query": {
"bool": {
"should": [
{ "match": { "content": "教程" } },
{ "match": { "content": "分布式" } }
]
}
}
}
例子:查找内容包含“教程”,但作者不是“李四”的文档,并且发布日期在 2023-10-27 之后。
json
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "content": "教程" } }
],
"must_not": [
{ "term": { "author.keyword": "李四" } } // 假设 author 有 keyword 子字段
],
"filter": [ // 使用 filter 更高效
{ "range": { "publish_date": { "gt": "2023-10-27" } } }
]
}
}
}
5. 过滤查询 – Filter Context
在 bool
查询中,filter
子句中的查询被称为在“过滤上下文”(Filter Context)中执行。与 must
和 should
(在查询上下文 Query Context 中执行,计算相关性得分)不同,过滤上下文中的查询只判断文档是否匹配,不计算得分,并且结果可以被缓存,这对于经常使用的过滤条件(如按日期范围、价格区间、分类等)非常高效。
常见的过滤查询有:
term
(用于精确值,如 ID, status)terms
(匹配多个精确值)range
(数值或日期范围)exists
(字段是否存在)bool
(组合其他过滤器)
例子:查找 views
字段大于 50 且小于等于 200 的文档。
json
GET /my_index/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"views": {
"gt": 50, // 大于
"lte": 200 // 小于等于
}
}
}
]
}
}
}
注意,为了使用 range
查询,字段必须是数字或日期类型。
6. 排序 – sort
默认情况下,搜索结果按相关性得分(_score
)降序排序。你可以通过 sort
字段指定按其他字段排序。
json
GET /my_index/_search
{
"query": {
"match_all": {}
},
"sort": [
{ "publish_date": { "order": "desc" } }, // 按发布日期降序
{ "views": { "order": "desc" } } // 再按浏览量降序
]
}
排序字段通常需要是精确值类型(如数字、日期、keyword)。
7. 分页 – from
和 size
当搜索结果很多时,我们需要分页显示。from
指定从哪个结果开始(从 0 开始计数),size
指定返回结果的数量。
json
GET /my_index/_search
{
"query": {
"match_all": {}
},
"from": 10, // 跳过前 10 个结果
"size": 5 // 返回 5 个结果
}
这将返回第 11 到 15 个结果。
第五章:Mapping 和 Analysis——理解数据如何被索引和搜索
前面我们提到了 text
类型和 keyword
类型的区别,以及 match
查询和 term
查询的区别。这与 Elasticsearch 的 Mapping 和 Analysis 密切相关,这是理解全文搜索的关键。
1. Mapping (映射)
Mapping 定义了文档中的字段及其数据类型,以及这些字段如何被 Elasticsearch 处理。当你索引一个文档时,如果索引不存在或字段是新的,Elasticsearch 会尝试动态地猜测字段类型并创建 Mapping(称为动态映射 Dynamic Mapping)。
例如,第一次索引以下文档时:
json
{
"title": "Elasticsearch 入门",
"publish_date": "2023-10-26",
"views": 100,
"tags": ["搜索", "数据库"]
}
Elasticsearch 可能会动态创建如下 Mapping:
json
{
"my_index": {
"mappings": {
"properties": {
"title": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } },
"publish_date": { "type": "date" },
"views": { "type": "long" },
"tags": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }
}
}
}
}
* title
和 tags
被映射为 text
类型,适合全文搜索。同时,它们自动生成了一个 .keyword
子字段,类型是 keyword
。
* publish_date
被映射为 date
类型。
* views
被映射为 long
类型。
你可以通过 GET /<index>/_mapping
查看索引的 Mapping:
json
GET /my_index/_mapping
虽然动态映射很方便,但在生产环境中,强烈建议显式定义 Mapping。这可以确保字段类型符合预期,避免因为数据不一致导致的类型冲突问题,并且可以更精细地控制字段的索引行为(例如,指定分词器)。
如何显式创建 Mapping?在创建索引时指定:
json
PUT /my_index_with_mapping
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_smart" // 指定中文分词器,如果已安装
},
"author": {
"type": "keyword" // 作者作为精确值,不分词
},
"publish_date": {
"type": "date",
"format": "yyyy-MM-dd" // 指定日期格式
},
"content": {
"type": "text",
"analyzer": "ik_max_word" // 指定中文分词器
},
"views": {
"type": "integer"
}
}
}
}
在这里,我们指定了字段类型,对文本字段指定了分词器 (例如 ik_smart
或 ik_max_word
,这是一个流行的中文分词器,需要额外安装插件)。将 author
设置为 keyword
类型意味着对其进行精确匹配查询时更高效和准确。
text
vs keyword
:
text
类型: 用于需要全文搜索的文本字段(如文章内容、商品描述)。Elasticsearch 会对text
字段的值进行 Analysis (分析),将其分解成一个个独立的词语(tokens),并创建倒排索引。match
查询用于搜索text
字段。keyword
类型: 用于需要精确匹配的字符串字段(如标签、国家、姓名、ID、状态)。keyword
字段的值会被视为一个整体,不会被分词。term
查询用于搜索keyword
字段。
2. Analysis (分析)
Analysis 是 Elasticsearch 对文本进行处理的过程,以便能够进行有效的全文搜索。这个过程由一个分析器 (Analyzer) 控制,分析器通常包含三个阶段:
- 字符过滤器 (Character Filters): 在文本分词之前对原始文本进行处理,如去除 HTML 标签、转换特殊字符等。
- 分词器 (Tokenizer): 将字符串分解成独立的词语(tokens)。这是 Analysis 过程中最核心的部分。例如,标准分词器会将“Quick Brown Foxes”分解成“Quick”, “Brown”, “Foxes”。中文分词器则会将句子分解成词语。
- 词语过滤器 (Token Filters): 对分词器产生的词语进行处理,如转小写、去除停用词(a, the, is等)、添加同义词、词干提取(将running变成run)等。
Elasticsearch 内置了多种分析器,最常用的是 standard
分析器。对于中文,通常需要安装第三方分词器插件(如 IK Analyzer)。
理解 Analysis 非常重要,因为它直接影响到搜索结果。例如,如果使用标准分析器索引了“Running is fun”,它会被索引为“running”, “is”, “fun”。当你搜索“run”时,如果配置了词干提取的词语过滤器,搜索“run”也能匹配到“running”。如果搜索“Running”,标准分析器会将其转为小写“running”进行搜索。
你可以使用 _analyze
API 来测试不同的分析器和文本:
json
POST _analyze
{
"analyzer": "standard", // 或其他分析器,如 ik_smart
"text": "This is a Test sentence. 测试句子。"
}
执行后,你会看到文本被分解成的词语列表以及它们在原始文本中的位置信息。
为什么 match
查询用于 text
,term
查询用于 keyword
?
- 当你使用
match
查询搜索text
字段时,Elasticsearch 会使用该字段配置的分析器对你的查询词进行分析,得到一组词语,然后在倒排索引中查找包含这些词语的文档。 - 当你使用
term
查询搜索keyword
字段时,Elasticsearch 不会分析查询词,直接查找字段值完全等于你的查询词的文档。
举例:如果 title
是 text
类型,使用标准分析器索引了“Elasticsearch 入门教程”。它会被分词为“elasticsearch”, “入门”, “教程”。当你用 match
查询搜索“入门教程”时,查询词也会被分词为“入门”, “教程”,然后 Elasticsearh 会查找包含“入门”或“教程”的文档。
如果 author
是 keyword
类型,值为“张三丰”。当你用 term
查询搜索“张三丰”时,Elasticsearch 会查找 author
字段值完全等于“张三丰”的文档。如果你搜索“张三”,则找不到。
第六章:实践与进阶方向
通过前面的章节,你已经了解了 Elasticsearch 的基本概念、环境搭建、以及如何进行简单的 CRUD 和搜索操作,并且初步理解了 Mapping 和 Analysis 的作用。
1. 多加实践
学习 Elasticsearch 最好的方式就是动手实践。
- 继续使用 Kibana 的 Dev Tools,尝试创建不同的索引,定义不同的 Mapping。
- 索引一些包含不同类型数据(文本、数字、日期、布尔值)的文档。
- 尝试各种
match
,term
,bool
,range
等查询,观察搜索结果。 - 尝试使用
sort
,from
,size
进行结果排序和分页。
2. 探索更多功能
Elasticsearch 的功能远不止于此。在你掌握了基础之后,可以进一步学习:
- 聚合 (Aggregations): 这是 Elasticsearch 强大的分析功能。你可以用它来对搜索结果进行分组、统计、计算平均值、最大最小值等等,非常适合用于生成报表或数据分析图表(Kibana 的大部分可视化就是基于聚合)。
- 高亮 (Highlighting): 在搜索结果中高亮显示匹配到的词语。
- Suggesters: 实现搜索推荐或自动完成功能。
- 地理位置搜索 (Geo-based Search): 搜索某个地理区域内的数据。
- 集群管理: 了解多节点集群的搭建、配置和管理。
- 数据摄取 (Data Ingestion): 学习如何使用 Logstash、Beats 或 Ingest Node 将来自不同源的数据导入 Elasticsearch。
- 监控与安全: 了解 Elasticsearch 的监控工具和安全特性。
3. 学习 ELK Stack (或ECK Stack)
Elasticsearch 通常不是单独使用的。ELK Stack (Elasticsearch, Logstash, Kibana) 或 ECK Stack (Elastic Cloud on Kubernetes,涵盖更多组件) 是一个强大的数据处理平台。学习 Kibana 的可视化功能,以及如何使用 Logstash 或 Beats 收集数据,会将你的 Elasticsearch 应用能力提升到一个新的水平。
4. 参考官方文档
Elasticsearch 的官方文档非常全面和准确,是学习的最佳资源。遇到问题时,查阅官方文档通常能找到答案。
结论
从零开始学习 Elasticsearch 可能看起来有些复杂,因为它引入了与传统数据库不同的概念和交互方式。但只要你理解了 Index, Document, Mapping, Shard 这些核心概念,并通过 Kibana 的 Dev Tools 勤加练习基本操作和 Query DSL,你很快就能掌握它的基础。
Elasticsearch 为处理海量、多样化的数据提供了强大的搜索和分析能力,无论你是想构建一个高性能的搜索引擎,还是搭建一个强大的日志分析平台,它都是一个值得投入时间学习的利器。
希望这篇入门教程能帮助你迈出 Elasticsearch 学习的第一步。祝你学习顺利!