ES基础概念架构

介绍

Elasticsearch (ES) 是一个开源的分布式搜索和分析引擎,它基于 Apache Lucene,并提供了一个RESTful API以与其交互。ES是构建在Java上的,它提供了一个高度可扩展的分布式架构,具有实时性能和高可用性。ES的主要用途包括全文搜索、日志分析、实时数据分析等。

本文将介绍ES的基础概念和架构,并提供一些示例代码来帮助读者更好地理解。

ES基础概念

索引

在ES中,索引是指存储和组织数据的逻辑容器。它类似于关系数据库中的数据库,可以包含多个类型。每个索引都有一个唯一的名称,用于在集群中标识和访问数据。

以下是一个创建名为"my_index"的索引的示例代码:

PUT /my_index

文档

文档是ES中的基本数据单元,可以是JSON、XML或其他格式的数据。每个文档都有一个唯一的ID,用于在索引中标识和检索数据。

以下是一个将文档添加到名为"my_index"的索引的示例代码:

POST /my_index/_doc
{
  "title": "Elasticsearch Introduction",
  "content": "This is a sample document for Elasticsearch introduction."
}

映射

映射定义了索引中每个字段的类型和属性。它类似于关系数据库中的表结构定义。ES使用动态映射来自动推断字段类型,但也可以显式指定映射。

以下是一个创建映射的示例代码:

PUT /my_index/_mapping
{
  "properties": {
    "title": {
      "type": "text"
    },
    "content": {
      "type": "text"
    }
  }
}

检索

ES提供了丰富的检索功能,可以根据各种条件过滤和排序结果。它支持全文搜索、前缀搜索、通配符搜索等。

以下是一个根据关键字检索文档的示例代码:

GET /my_index/_search
{
  "query": {
    "match": {
      "title": "Elasticsearch"
    }
  }
}

ES架构

ES的架构是分布式的,它将数据划分为多个分片,每个分片可以在集群中的不同节点上进行复制和存储。这种分片和复制机制提供了高可用性和横向扩展性。

以下是一个ES集群的简化架构示意图:

gantt
    dateFormat  YYYY-MM-DD
    title ES Cluster Architecture

    section Master Node
    Master Node       :a1, 2022-01-01, 30d

    section Data Nodes
    Data Node 1      :a2, after a1, 30d
    Data Node 2      :a3, after a2, 30d
    Data Node 3      :a4, after a3, 30d

    section Client
    Client Node      :a5, after a4, 30d

ES集群通常由一个主节点、多个数据节点和一个客户端节点组成。主节点负责分配和管理索引、分片和复制。数据节点存储索引的分片和副本。客户端节点用于与集群进行交互。

示例代码

以下是一个使用Python库elasticsearch-py与ES进行交互的示例代码:

from elasticsearch import Elasticsearch

# 创建ES客户端
es = Elasticsearch("http://localhost:9200")

# 创建索引
es.indices.create(index="my_index")

# 添加文档
doc = {
  "title": "Elasticsearch Introduction",
  "content": "This is a sample document for Elasticsearch introduction."
}
es.index(index="my_index", id=1, body=doc)

# 检索文档
res = es.search(index="my_index", body={"query": {"match": {"title": "Elasticsearch"}}})
for hit in res['hits']['hits']:
    print(hit