学习Elasticsearch必需了解的十个概念

学习Elasticsearch必需了解的十个概念

与学习其他数据库或语言一样,学习Elasticsearch首先需要掌握基本概念,理解这些基本概念会让你的学习曲线少些波折。虽然这些概念特别适用于Elasticsearch,但是在应用整个ELK Stack(Elasticsearch、Logstash 和 Kibana)时理解它们也很重要。为了更容易理解,我会把一些概念与关系数据库术语进行比较。

1. 字段

  • 字段
    字段是Elasticsearch数据的最小单元,用来描述文档。如:标题、作者、日期、摘要等。每个字段有对应数据类型和数据。
    数据类型包括核心数据类型(strings, numbers, dates, booleans),复杂数据类型(object, nested),geo数据类型(get_point, geo_shape)以及特定数据类型(IP,Completion,Alias等)。字段类型不同管理机制也有差异,字段也是Elasticsearch mapping的重要组成部分。

  • 多字段(Multi-fields)
    通常对同一字段针对不同搜索目的使用多种索引方法。如字符串类型字段可以同时映射为textkeyword类型,前者可以全文索引,后者可进行排序或聚集。当然也可以对同一字段使用不同分析器,如标准分析器,英文分析器或中文分析器。

  • 元字段(Meta-fields)
    每个文档都包括一些元字段,如_index,_type,_id等。这些元字段可以在创建映射类型时进行自定义。

2. 文档

文档是存储在Elasticsearch中的Json对象,可理解为基本存储单元。与关系型数据相比,文档可看作表中行或记录。举例,电子商务的应用中每个产品是一个文档,或每个订单是一个文档。存储在特定索引中的文档没有限制。

文档中的数据有字段组成,每个字段包括键和值。键即字段的名称,值可以不同数据类型对应的内容项,如string, number, boolean , object, array等。文档也包括保留的元字段:

  • _index – 当前文档对应索引
  • _type – 当前文档对应类型(_doc)
  • _id – 当前文档的唯一标识

文档示例:

{
   "_id": 3,
   “_type”: [“your index type”],
   “_index”: [“your index name”],
   "_source":{
        "age": 28,
        "name": ["daniel”],
        "year":1989,
    }
}

3. 映射

说到映射需要注意的是,Elasticsearch7.0之后,type已经被弃用。映射类似于关系型数据库中表的结构(原来的类型相当于表,索引相当于数据库),在映射中定义文档字段及其类型,数据类型决定了字段在Elasticsearch中被如何分词、索引或存储。举例:

PUT /example
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "gender": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}

4. 映射类型

前面已经提过,映射类型是7.0之前的产物,之后已不再使用。但有必要了解,为了向后兼容,一些场景中使用_doc作为默认值。现在可以定义任意字段(keyword)对文档进行分类,确实也没有使用映射类型的必要。

5. 索引

索引,Elasticsearch中最大数据单元,可以类比为关系型数据库中的数据库单元。还是前面的示例,索引中可以包含所有产品数据和客户相关数据。当然也可以在Elasticsearch中定义多个索引,索引使用小写名称定义,通过索引可以对文档执行操作,如搜索、删除等。

6. 分片

简言之,分片是Elasticsearch的基本构建块,底层是单个Lucene索引,多个分片支撑系统可扩展性。索引大小是造成Elasticsearch崩溃的常见原因,由于每个索引可存储文档数量没有限制,所以索引占用的磁盘空间可能会超过主机限制;一旦接近极限,索引就会开始失败。

解决该问题的一种方法是将索引水平分割为称为多个块,并允许跨节点进行分布式分隔以提高性能。创建索引时,可以定义多少分片。每个分片是单独的Lucene索引,可以在集群中任何主机上,示例代码:

PUT /example
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }, 
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "gender": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}

7. 复制

复制就如其名称所暗示的,是Elasticsearch的容错机制,即索引分片的拷贝。这是有用的备份方式,以备不时之需。同时副本还能提供读请求,因此增加副本还可以提高搜索性能。

为了确保高可用性,副本不放在与原始分片(也称为主分片)相同的节点上。举例,Shard1可能与Shard2副本在节点A上,而节点B主机上有Shard2和Shard1的副本。真实场景可能会有更多的分片。

与分片定义一样,在创建索引时可以指定每个分片的副本数量。但与分片的差别是,副本数量在索引创建之后还可以改变。因此每个分片可以有多个副本,但需要在分片数量上有适当的权衡。过多的片会导致更多开销和资源消耗,也会影响性能和速度。

8. 分析器

分析器是在索引过程中使用,将短语或表达式分词、解析成一系列关键词。分析器在索引中定义,包括单个分词器和多个过滤器。例如,分词器遇到特定表达式时将字符串分割成特定术语。常见的分析器包括Standard Analyzer 和 Simple Analyzer,以及与特定语言相关的分析器。

缺省情况下Elasticsearch使用Standard Analyzer,其包含基于语法的分词器,删除通用词并增加额外的过滤器。Elasticsearch包括一系列内置分词器,也支持自定义分词器。

过滤器用于过滤或修改一些语义词。如ASCII folding filter会将诸如ê, é, è等字符转换为e。

PUT /example
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "analysis": {
      "analyzer": {
        "hanlp_analyzer": {
          "tokenizer": "nc_hanlp"
        }
      },
      "tokenizer": {
        "nc_hanlp": {
          "type": "hanlp",
          "enable_stop_dictionary": true
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "hanlp_analyzer"
      },
      "gender": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}

9. 实例与节点

ELK的核心是Elasticsearch实例,其关键任务是存储和索引数据。集群中不同节点类型负责不同职责:

  • Master nodes — 负责集群管理配置相关动作,如增加或删除节点
  • Data nodes — 存储数据并执行数据相关操作,如搜索和聚集
  • Ingestion nodes — 用于索引前的预处理文档
  • Machine Learning nodes (有许可) – 这些节点在Elastic许可下可用,支持机器学习任务。

默认情况下,每个节点被自动分配便于管理的唯一标识符(或名称),所有节点都可以是主节点、数据节点或机器学习节点。当集群变大时,建议使用单一类型来区分每个节点。
缺省单个节点将形成名为“elasticsearch”单节点集群,但也可使用其他集群名称将其配置为现有集群的节点。当然这些节点需要能够相互识别才能连接。
在开发或测试环境中可以在单台服务器上设置多个节点。但在生产环境中,由于Elasticsearch节点消耗资源数量较多,建议在单个服务器上运行一个Elasticsearch实例。

10. 集群

Elasticsearch集群有多个节点组成。和节点一样,集群带有节点加入唯一标识。默认为“elasticsearch”,当然名称可以修改。请确保在不同环境中不要对集群使用相同名称,否则可能节点加入错误集群。

集群中的主节点负责管理配置工作,如增加或删除节点。该节点有集群自动选择,也可以修改。可以在集群中任何节点上执行查询,包括“主”节点。但节点也将查询转发给包含被查询数据的节点。
有许多有用的集群API,能查询集群状态。举例,Cluster Health API 状态报告“绿色”(所有分片都已分配),“黄色”(主分片被分配,但副本分片没有完全分配),“红色”(分片没有被分配)。

GET /_cluster/health
{
  "cluster_name" : "newcloud",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 20,
  "active_shards" : 40,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

11. 总结

意思简要列举并解释了学习ELK时需掌握的主要概念。当然还有其他一些组件和术语也很重要,读者可以查阅官方文档。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章