Elasticsearch ES核心概念
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,如果超出长度,字段值会被忽略,而不是截断。
- 点赞
- 收藏
- 关注作者
评论(0)