Elasticsearch ES核心概念

举报
赵不辞 发表于 2023/07/09 13:54:09 2023/07/09
【摘要】 ES核心概念本文内容基于ES 7.17 集群健康状态Green:所有Primary和Replica均为active,集群健康Yellow:至少一个Replica不可用,但是所有Primary均为active,数据仍然是可以保证完整性的。Red:至少有一个Primary为不可用状态,数据不完整,集群不可用。GET _cluster/health{ "cluster_name" : "zgc-...

ES核心概念

本文内容基于ES 7.17

集群健康状态

Green:所有Primary和Replica均为active,集群健康

Yellow:至少一个Replica不可用,但是所有Primary均为active,数据仍然是可以保证完整性的。

Red:至少有一个Primary为不可用状态,数据不完整,集群不可用。

GET _cluster/health
{
  "cluster_name" : "zgc-cluster",
  // 集群状态
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 5,
  "number_of_data_nodes" : 4,
  "active_primary_shards" : 12,
  "active_shards" : 12,
  // 迁移中的副本数量,主要是做负载均衡
  "relocating_shards" : 0,
  // 正在初始化中
  "initializing_shards" : 0,
  // 未分配分片
  "unassigned_shards" : 1,
  "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" : 92.3076923076923
}

shard

相当于你要把数据存到几个地方

一个索引包含一个或多个分片,在7.0之前默认五个主分片,每个主分片一个副本;在7.0之后默认一个主分片。副本可以在索引创建之后修改数量,但是主分片的数量一旦确定不可修改,只能创建索引
每个分片都是一个Lucene实例,有完整的创建索引和处理请求的能力
ES会自动再nodes上做分片均衡
一个doc不可能同时存在于多个主分片中,但是当每个主分片的副本数量不为一时,可以同时存在于多个副本中。
每个主分片和其副本分片不能同时存在于同一个节点上,所以最低的可用配置是两个节点互为主备。

shard主要解决并发性能及单机容量问题.

副本

每个shard要备份几个,比如副本为2+主一共有3个

节点

一个节点代表一个es进程.但是它不等于一个服务器. 可以在一个es目录启动多个进程.

_doc

表示一行记录,最小存储单元

PUT index_name/_doc/doc_id
索引名称/_doc/doc的id

kibana的使用介绍

部署kibana之前文章已经介绍,这里不赘述.

支持各种异构语言调用,提供了各种REST及各种语言的API.

我们在kibana主要使用REST风格的API

DELETE /index_name?pretty

pretty 表示把输出内容格式化

这个是删除一个索引

查询索引信息

GET /index_name/_search

一般以下划线开头的都是es提供的API

修改数据

PUT /index_name /_doc/docId

{

// Your content

}

PUT 属于覆盖更新, 如果你不写的就删除,写的就更新,即不修改的也要保留原值

部分修改数据:

POST /index_name/_update/doc_id

{

“doc”:{

“col_name”: col_value

}

}

索引前边反斜杠可选的

一些输出属性说明

_cat : 一般查看元信息

_version: es根据version进行软删除

_hit中的total表示命中几个

_score : 表示评分

mapping

Mapping 也称之为映射,定义了 ES 的索引结构、字段名称、字段类型、分词器等属性、是否评分、是否创建索引等,是索引必不可少的组成部分。

映射定义的内容跟表结构有一部分重叠,但是它只是索引定义的一部分.一个索引定义有三部分

alias/mapping/settings

映射后期不允许修改.这点和表结构也不同.

查看mapping(所有)

GET index_name/_mapping[s]

GET index_name/_mapping[s]/field/field_name

_mapping _mappings都可以

映射参数

映射方式

映射类型

映射模板

自动映射

指的即使你没定义字段和类型,根据你的输入自动创建字段和类型等元数据.

test_idx_auto_mapping索引不存在直接往里边写数据

PUT test_idx_auto_mapping/_doc/1
{
  "name":"John",
  "age": 13
}

GET test_idx_auto_mapping

会自动创建mapping信息

推断类型时尽可能给你最宽的

{
  "test_idx_auto_mapping" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "name" : {
          // text类型支持全文检索
          "type" : "text",
          // 子字段
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "include" : {
              "_tier_preference" : "data_content"
            }
          }
        },
        "number_of_shards" : "1",
        "provided_name" : "test_idx_auto_mapping",
        "creation_date" : "1687782642873",
        "number_of_replicas" : "1",
        "uuid" : "IKdKu7qmRwOIt7C7HW-XeQ",
        "version" : {
          "created" : "7171099"
        }
      }
    }
  }
}

显示映射

生产环境一定要显示映射

PUT test_mapping_manual1
{
  "mappings": {
    "properties": {
      "col1": {
        "type": "text",
        "fields": {
          "col1Sub": {
            "type": "long"
          }
        }
      },
      "col2": {
        "type": "text"
      }
    }
  }
}
GET test_mapping_manual1

映射参数

不一定要全掌握, 主要是先了解,知道哪些是干啥用的,用时具体看即可

index : 要不要检索这个字段,不需要检索的可以设置为false,节省磁盘

analyzer: 分词器(字段必须可分词的类型),这个是对存储的数据进行分词

search_analyzer: 这个是对你搜索条件进行分词

boost : 评分权重 2:表示2倍

corece: 是否强制类型转换

doc_values: 排序和聚合处理的字段,提升性能

fielddata: 首次对这个字段使用排序和聚合字段, 放到内存中. 与doc_values区别就前者放到磁盘中. 如果开启可能导致内存占用特别多. 支持动态设置. doc_values一旦设置不可修改

dynamic:是否动态添加字段

fields:给field创建多字段,目的是全文检索或者聚合分析

format:格式化date

meta:设置自定义元数据

null_value:为null设置默认值

映射模板

之前讲过的映射类型或者字段参数,都是为确定的某个字段而声明的,如果希望对符合某类要求的特定字段制定映射,就需要用到映射模板:Dynamic templates。

映射模板有时候也被称作:自动映射模板、动态模板等。

用法

基本语法

"dynamic_templates": [
    {
      "my_template_name": { 
        ... match conditions ... 
        "mapping": { ... } 
      }
    },
    ...
]

Conditions参数

  • match_mapping_type :主要用于对数据类型的匹配
  • match 和 unmatch:用于对字段名称的匹配

案例

PUT test_dynamic_template
{
  "mappings": {
    "dynamic_templates": [
      {
      	// 你的模板的名字
        "your_template_name": {
          "match_mapping_type": "long",
          // 把long映射成integer
          "mapping": {
            "type": "integer"
          }
        }
      },
      {
        "longs_as_strings": {
        // match相关的都是定义匹配规则
          "match_mapping_type": "string",
          "match": "num_*",
          "unmatch": "*_text",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}

以上代码会产生以下效果:

  • 所有 long 类型字段会默认映射为 integer
  • 所有文本字段,如果是以 num_ 开头,并且不以 _text 结尾,会自动映射为 keyword 类型

子字段

 "mappings" : {
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "name" : {
          // text类型支持全文检索
          "type" : "text",
          // name的子字段
          "fields" : {
            "keyword" : {
              // keyword类型精准查找
              "type" : "keyword",
              // 作为关键超过多长之后就截断
              "ignore_above" : 256
            }
          }
        }
      }
    },

类型

object

对象包含properties就是object

数组

数组的类型取决于第一个元素的类型, 元素类型必须保持一致

Text 和 Keyword 类型

Text 类型

当一个字段是要被全文搜索的,比如 Email 内容、产品描述,这些字段应该使用 text 类型。设置 text 类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。

注意事项

  • 适用于全文检索:如 match 查询
  • 文本字段会被分词
  • 默认情况下,会创建倒排索引
  • 自动映射器会为 Text 类型创建 Keyword 字段

Keyword 类型

Keyword 类型适用于不分词的字段,如姓名、Id、数字等。如果数字类型不用于范围查找,用 Keyword 的性能要高于数值类型。

如当使用 keyword 类型查询时,其字段值会被作为一个整体,并保留字段值的原始属性。

GET test_index/_search
{
  "query": {
    "match": {
      "title.keyword": "测试文本值"
    }
  }
}

注意事项

  • Keyword 不会对文本分词,会保留字段的原有属性,包括大小写等。
  • Keyword 仅仅是字段类型,而不会对搜索词产生任何影响
  • Keyword 一般用于需要精确查找的字段,或者聚合排序字段
  • Keyword 通常和 Term 搜索一起用(会在 DSL 中提到)
  • Keyword 字段的 ignore_above 参数代表其截断长度,默认 256,如果超出长度,字段值会被忽略,而不是截断。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。