Elasticsearch基本概念

  1. 近实时(NRT)
    • Elasticsearch 是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个很小的延迟(通常是 1 秒)
  2. 集群(cluster)
    • 代表一个集群,集群中有多个节点(node),其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
  3. 节点(node)

    • 一个Node是一个独立的Server,同时是Cluster中的一部分。存储数据,参加集群的索引和搜索。一个Node有一个唯一的名字标志,启动的时候系统会分配一个随机UUID作为默认的Node名称。

      当我们需要标志网络中哪个计算机对应着Cluster中的哪个节点的时候,Node name显得非常重要。

      我们可以通过Cluster Name 指定Node进入特定的Cluster。默认情况下,Node是进入到“elasticsearch ”集群的。也就是说,如果我们启动了很多的node,默认情况下这些node都会进入到“elasticsearch ”集群。

在一个Cluster中,我们可以有很多的Node。
4. 索引(Index)
* 类似于mysql的数据库(database),或者一个数据存储方案(schema).索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。
5. 类型(Type)
* 类型是索引内部的逻辑分区(category/partition),类似于mysql数据库中的table表,es可以在Index中建立type(table),通过mapping进行映射
6. 文档(Document)
* 文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。一条数据对应一篇文档即相当于mysql数据库中的一行数据row;一个文档可以有多个字段相当于mysql数据库一行可以有多列
7. Field
* es中一个文档中对应的多个列与mysql数据库中每一列对应
8. 映射(Mapping)
* 可以理解为mysql或者solr中对应的schema,只不过有些时候es中的mapping增加了动态识别功能,实际生产不建议使用,最好还是开始制定好了对应的schema为主
9. 分片和复制(shards & replicas)
* Index可以存储大量的数据,可以超过单个节点的硬件限制。比方说,单个Index上十亿数据可以占据1TB的硬盘空间可能不适合在磁盘上的一个节点,或者会使得搜索变得很慢。
* 为解决这样的问题,Elasticsearch 提供了细分Index到多片的功能,这些分片叫做shard。每当创建一个index的时候,我们可以定义这个Index的shard数量。
* 每个Shard本身就是一个全功能和独立的“index”,可以托管在集群中的任何节点上。
* shard的重要性:
1. 允许我们水平切分内容;
2. 允许我们通过分配和平行化的跨shard操作来提高系统吞吐。
* shard的分配以及查询时候数据的聚合对于用户是透明的。
* 在云环境中,系统在任何时候都有故障的风险,Elasticsearch 允许我们对shard做一个或者多个备份,叫做replica shards, 简称为replicas.
* replicas的重要性体现在两个方面:
1. 增加了集群的高可用性。所以replicas不和shard同时存储在同一个server上。
2. 允许我们扩展搜索量因为搜索可以在所有的replicas上同时执行。
* 综上,每一个Index可以被分成许多的shards。一个index可以有0个或者多个副本。一旦被复制,index就有了primary shards和replica shards 。我们可以在index创建时指定shards 和replicas 的数量。replicas 的数量可以在任何时候被修改,但是shards 的数量不能在创建后修改。
* 默认情况下,Elasticsearch中的每个index被分配5个shards和1个replica(每个主分片有一个复制分片)。
* 所以如果在集群中有两个nodes,那么默认情况下1个index有10个shards。

### Elasticsearch基本概念 #### 节点与实例 节点是指一个 Elasticsearch 实例,其本质上是一个 Java 进程。每台机器可以运行多个 Elasticsearch 实例,但在生产环境中通常建议每台机器仅运行一个实例以优化性能和资源管理[^1]。 #### 集群组成 Elasticsearch 是一种分布式搜索引擎,由多个节点共同组成一个集群。一个集群至少包含一个节点,而每个节点都可以拥有多个索引[^4]。 #### 数据存储单元:索引、分片与副本 - **索引**:类似于传统数据库中的表,用于存储文档集合。 - **分片 (Shard)**:为了提高可扩展性和性能,索引被划分为若干个主分片(Primary Shard),这些分片分布在不同的节点上,默认情况下每个索引会被分成 5 个主分片。 - **副本 (Replica)**:每个主分片都有对应的副本分片(Replica Shard),用于提供冗余备份以及增强读取操作的能力。默认情况下,每个主分片都会有一个副本。 #### 数据定位机制 当向 Elasticsearch 插入一条数据时,系统会基于指定的关键字(Key)计算该条记录应归属于哪一个分片。此关键字通常是自动生成的 ID 或者可以根据具体需求设置成其他字段值,例如在某些业务场景下可能选用 `CompanyID` 作为 Key 来实现更精确的数据分布控制[^5]。通过下面这个公式完成分片的选择过程: ```plaintext shard_num = hash(_routing) % num_primary_shards ``` #### 功能特性 Elasticsearch 将全文搜索、结构化查询及数据分析等功能融合为一体,并能高效处理海量级数据集,在接近实时的时间范围内支持复杂的搜索请求和统计分析任务[^2]。它非常适合应用于大规模的日志监控、网站内容检索以及其他需要快速响应的大规模数据访问场合;而对于那些强调严格一致性且涉及较多关联运算的应用,则更适合采用 MySQL 等关系型数据库解决方案[^3]。 ### 示例代码展示如何创建简单的索引 以下是利用 Python 对接 Elasticsearch 并创建新索引的一个例子: ```python from elasticsearch import Elasticsearch es_client = Elasticsearch(["http://localhost:9200"]) index_name = "test_index" if not es_client.indices.exists(index=index_name): settings = { "settings": { "number_of_shards": 3, "number_of_replicas": 1 }, "mappings": { "properties": { "title": {"type": "text"}, "content": {"type": "text"} } } } response = es_client.indices.create(index=index_name, body=settings) print(f"Index created successfully {response}") else: print("Index already exists.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值