好的,我们来清晰、结构化地了解 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 字段中查找包含词语 “核心” 或 “概念” 的文档(因为 contenttext 类型,会被分词)。
  • 搜索结果会按相关性 (_score) 排序返回。

总结

  1. 文档 (Document):
    • 基本数据单元,JSON 格式。
    • 包含字段和实际数据。
    • 在索引内有唯一 _id
  2. 索引 (Index):
    • 相关文档的集合容器。
    • 定义了文档的映射 (Mapping)(字段名、数据类型)。
    • 分布式存储、搜索和性能调优的基础单元
  3. 操作流程:
    • 创建索引 (定义映射): PUT /index_name (推荐预先明确定义映射)。
    • 索引文档 (添加/更新数据): PUT /index_name/_doc/document_id { ... json ... }
    • 检索文档 (按 ID 获取): GET /index_name/_doc/document_id
    • 搜索文档 (按条件查找): GET /index_name/_search { "query": { ... } }

理解索引和文档是掌握 Elasticsearch 的第一步。它们是构建强大搜索和分析功能的基础。后续你会接触到更复杂的查询、聚合分析、索引管理(如别名、模板)等概念。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐