Elasticsearch入门:索引和文档
·
好的,我们来清晰、结构化地了解 Elasticsearch 的核心概念:索引 (Index) 和 文档 (Document)。这是使用 Elasticsearch 的基础。
核心概念类比 (关系型数据库视角):
| Elasticsearch 概念 | 近似关系型数据库概念 | 说明 |
|---|---|---|
| 索引 (Index) | 数据库 (Database) | 存储相关文档的容器。 |
| 文档 (Document) | 行 (Row) | 索引中的基本数据单元。 |
| 字段 (Field) | 列 (Column) | 文档中的具体属性/数据项。 |
| 映射 (Mapping) | 表结构 (Schema) | 定义文档的结构和字段的数据类型。 |
1. 文档 (Document)
- 是什么? 文档是 Elasticsearch 中最小的、可被索引的数据单元。它代表一个实体(例如:一个产品、一篇文章、一条日志记录)。
- 格式: 文档采用 JSON (JavaScript Object Notation) 格式表示。JSON 是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。
- 内容: 文档包含实际的数据,由多个 字段 (Field) 组成。每个字段都有一个名称和一个值(值可以是字符串、数字、布尔值、日期、数组、对象等)。
- 唯一标识: 每个文档在所属的索引内都有一个唯一的
_id。你可以自己指定这个_id,也可以让 Elasticsearch 自动生成。
示例文档 (JSON 格式):
{
"_id": "1", // 文档的唯一标识符 (可自定义或自动生成)
"title": "Elasticsearch 入门指南",
"author": "张三",
"content": "本文介绍了 Elasticsearch 的核心概念索引和文档...",
"publish_date": "2023-10-27",
"tags": ["搜索", "数据库", "入门"],
"views": 150
}
- 这个文档描述了一篇文章。
- 它包含字段:
title(字符串),author(字符串),content(字符串),publish_date(日期),tags(字符串数组),views(整数)。
2. 索引 (Index)
- 是什么? 索引是具有相似特征的文档的集合。它是文档的逻辑容器,是 Elasticsearch 中组织数据的主要方式。
- 作用:
- 数据组织: 将相关文档分组(例如:
products索引存放所有产品文档,logs索引存放所有日志文档)。 - 定义结构 (映射): 索引包含一个 映射 (Mapping),用于定义其包含的文档的字段名称、数据类型(如
text,keyword,date,long等)以及如何处理这些字段(如是否分词、使用什么分词器)。 - 性能优化: 索引是 Elasticsearch 分布式存储和搜索的基本单元。数据被分片 (Shard) 存储在索引中,副本 (Replica) 提供高可用性。索引设置(如分片数量、副本数量)影响存储、搜索性能和容错能力。
- 数据组织: 将相关文档分组(例如:
- 创建索引 (通常需要指定映射): 在写入文档之前,最好先创建索引并定义好映射,这样能精确控制字段的处理方式。如果直接写入文档到一个不存在的索引,Elasticsearch 会自动创建该索引并尝试推断字段类型(动态映射),但这可能不符合预期。
创建索引示例 (使用 REST API):
PUT /articles // 创建一个名为 "articles" 的索引
{
"mappings": { // 定义映射
"properties": { // 定义文档的字段属性
"title": { "type": "text" }, // text 类型:会被分词,用于全文搜索
"author": { "type": "keyword" }, // keyword 类型:不会被分词,用于精确匹配、聚合、排序
"content": { "type": "text" },
"publish_date": { "type": "date" }, // date 类型
"tags": { "type": "keyword" }, // 数组中的每个元素都是 keyword
"views": { "type": "integer" } // integer 类型
}
}
}
- 这个操作创建了一个名为
articles的索引。 - 它定义了映射,指定了文档将包含哪些字段以及每个字段的数据类型和基本行为(如
text字段会被分词,keyword字段则作为整体处理)。
3. 索引文档 (Indexing a Document)
将文档存储到索引中的过程称为“索引文档”(注意:这里的“索引”是动词)。这是添加或更新数据的主要方式。
索引文档示例 (使用 REST API):
PUT /articles/_doc/1 // 向索引 "articles" 添加一个文档,并指定其 _id 为 "1"
{
"title": "Elasticsearch 入门指南",
"author": "张三",
"content": "本文介绍了 Elasticsearch 的核心概念索引和文档...",
"publish_date": "2023-10-27",
"tags": ["搜索", "数据库", "入门"],
"views": 150
}
PUT /articles/_doc/1:指定目标索引 (articles),使用默认类型 (_doc),并设置文档_id=1。- 如果索引
articles不存在,Elasticsearch 可能会自动创建它(如果动态索引开启),并使用动态映射猜测字段类型(不推荐在生产中依赖此行为)。 - 如果索引
articles已存在且包含映射,Elasticsearch 会校验文档字段是否符合映射定义。
4. 检索文档 (Retrieving a Document)
根据文档的 _id 从索引中获取文档。
检索文档示例 (使用 REST API):
GET /articles/_doc/1 // 从索引 "articles" 中获取 _id 为 "1" 的文档
响应:
{
"_index": "articles", // 文档所在的索引
"_id": "1", // 文档的ID
"_version": 1, // 文档的版本号(每次更新递增)
"_seq_no": 0,
"_primary_term": 1,
"found": true, // 是否找到
"_source": { // 文档的原始 JSON 内容
"title": "Elasticsearch 入门指南",
"author": "张三",
"content": "本文介绍了 Elasticsearch 的核心概念索引和文档...",
"publish_date": "2023-10-27",
"tags": ["搜索", "数据库", "入门"],
"views": 150
}
}
5. 搜索文档 (Searching Documents)
Elasticsearch 的核心功能是在索引中执行搜索查询,而不仅仅是按 _id 获取。搜索基于 倒排索引 (Inverted Index) 实现高效全文检索。
简单搜索示例 (使用 REST API):
GET /articles/_search // 在索引 "articles" 中搜索
{
"query": {
"match": { // 使用 match 查询
"content": "核心概念" // 在 content 字段中搜索包含 "核心" 或 "概念" 的文档
}
}
}
- 这个查询会在
articles索引的所有文档的content字段中查找包含词语 “核心” 或 “概念” 的文档(因为content是text类型,会被分词)。 - 搜索结果会按相关性 (
_score) 排序返回。
总结
- 文档 (Document):
- 基本数据单元,JSON 格式。
- 包含字段和实际数据。
- 在索引内有唯一
_id。
- 索引 (Index):
- 相关文档的集合容器。
- 定义了文档的映射 (Mapping)(字段名、数据类型)。
- 是分布式存储、搜索和性能调优的基础单元。
- 操作流程:
- 创建索引 (定义映射):
PUT /index_name(推荐预先明确定义映射)。 - 索引文档 (添加/更新数据):
PUT /index_name/_doc/document_id { ... json ... }。 - 检索文档 (按 ID 获取):
GET /index_name/_doc/document_id。 - 搜索文档 (按条件查找):
GET /index_name/_search { "query": { ... } }。
- 创建索引 (定义映射):
理解索引和文档是掌握 Elasticsearch 的第一步。它们是构建强大搜索和分析功能的基础。后续你会接触到更复杂的查询、聚合分析、索引管理(如别名、模板)等概念。
更多推荐
所有评论(0)