Elasticsearch学习笔记

4/4/2023 Elasticsearch

# ES学习笔记

# 1.搭建ELK集群

后续补充

# 2.ES基础

# 2.1 基本操作

http的操作需要大写(PUT/GET/POST/DELETE/HEAD/OPTIONS)

# 使用PUT向 dbindex/_doc/1中插入数据,指定id=1
PUT dbindex/_doc/1
{
  "name":"yim",
  "age":25,
  "actionTime": "2023-04-04",
  "id":2,
  "addr": "随便"
}

# 在 dbindex/_doc/中获取id=1的数据
GET dbindex/_doc/1

# 使用GET在dbindex/_doc/中获取所有数据
GET dbindex/_doc/_search

# 使用POST向 dbindex/_doc中插入数据,不用指定文档id
POST dbindex/_doc
{
  "name":"123"
}

# 使用POST修改文档,语法 POST dbindex/_doc/文档_id/_update
POST dbindex/_doc/yyhOSocB7VY9_-BPWtxj/_update
{
  "doc":{
    "name":"223"
  }
}

# PUT执行修改操作时,会对文档的整个内容进行替换
# POST执行修改操作时,如果字段在文档中,则修改此字段的值;如果字段不在文档中,则把此字段加入文档信息中

# 使用POST查询索引库中的所有数据
POST dbindex/_doc/_search

# 使用DELTE删除dbindex/_doc中的文档
DELETE dbindex/_doc/某一_id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 2.2 使用GET查询

常用的GET查询语句

# 根据_id查询文档详情
GET 索引库名称/_doc/文档_id
# 查询指定索引库中所有的文档信息
GET 索引库名称/_doc/_search
# 查询当前集群中所有的别名索引库信息
GET /_cat/indices
# 查询当前集群中所有的别名索引信息
GET /_cat/aliases
# 查询当前集群的颜色信息
GET /_cat/health
# 查询当前集群中主节点的信息
GET /_cat/master
# 查询当前集群中从节点的信息
GET /_cat/node
# 查询当前集群中索引分片的信息
GET /_cat/shards
# 查询当前集群的健康状态
GET _cluster/health?pretty=true
# 查询当前集群的运行状态信息
GET _cluster/stats?pretty
# 查询当前集群中所有节点的监控信息
GET _nodes/stats?pretty
# 查询当前集群中所有索引的监控信息
GET _stats?pretty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

注:

集群的健康状态:
{
  "cluster_name" : "elasticsearch-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 8,
  "active_shards" : 16,
  "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
}
参数:
status:表示集群状态,green、yellow、red
number_of_nodes/number_of_data_nodes:表示集群的节点数和数据节点数
active_primary_shards:表示集群中所有活跃的主分片数
active_shards:表示集群中所有活跃的分片数
relocating_shards:表示当前节点迁往其他节点的分片数量,通常为0,当有节点加入或者退出时该值会有相应变化
initializing_shards:表示正在初始化的分片
unassigned_shards:表示未分配的分片数,通常为0。当有某个节点的副本分片丢失时,该值会相应的变化
number_of_pending_tasks:表示主节点创建索引并分配了分片任务,如果该指标数值一直未减少,则代表集群存在不稳定因素,需要排除找到具体问题。而等待的任务只能由主节点进行处理,这些任务包括创建索引并将分片任务分配给节点
active_shards_percent_as_number:表示当前集群中分片的健康度(活跃分片数占总分片数的比例)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
查询集群节点的监控信息
参数:
name:表示节点名称。
roles:表示节点角色类型。
indices.docs.count:表示索引文档总数量。
segments.count:表示集群中段(数据存储单位)的总数量。
jvm.heap_used_percent:表示内存的使用百分比。
thread_pool.{bulk,index,get,search}.{active,queue,rejectd}:表示线程池的一些信息
主要指标有激活的(active)线程数,线程队列(queue)数和被拒绝(rejected)线程数量
以下指标是累加值,当节点重启之后会清零:
indices.indexing.index_total:表示索引文档数道。
indices.indexing.index_time_in_millis:表示使用索引总耗时。
indices.gt.total:表示get请求的数量。
indices.get.time_in_millis:表示get请求总耗时。
indices.scarch.query_total:表示search请求的总数。
indices.search.query_time_in_milis:表示search求的总耗时。
indices.search.fetch_total:表示fetch请求的总数量。
indices.search.fetch_time_in_millis: 表示fetch请求的总耗时。
jvm.gc.collectors.young.collection count:表示年轻代垃圾回收次数。
jvm.ge.colleaors young.colection_time_in_millis:表示年轻代垃圾回收总耗时。
jvm.gc.collectors.old.collection_count:表示老年代垃圾回收次数。
jvm.ge.collectors old.collection_time_in_milis:表示老年代垃圾回收总耗时。

需要计算的参数:
index_per_min:每分钟索引请求数量。计算公式如下:
案引请求率=index_total(指标的两次采集差值)/系统时间差值 (ms) × 60000 (公式1)
indexAverge_per_min:索引请求处理延迟。计算公式如下:
索引延迟率=index_time_in_millis(两次耗时的差值)/index_total (两次索引数量的差值) (公式2)
get_per_min:表示每分钟get请求的数量,参照计算公式1。
getAverage_per_min:表示get请求的处理延迟率,参照计算公式2。
merge_per_min:表示每分钟merge请求的数量,参照计算公式1。
mergeAverage_per_min:表示merge请求的处理延迟率,参照计算公式2。
searchQuery_per_min:表示每分钟query请求的数童,参照计算公式1。
searchQueryAverage_per_min:表示query请求的延迟率,参照计算公式2。
searchFetcb_per_min:表示每分钟fetch请求的数童,参照计算公式1。
searchFetchAverage_per_min:表示fetch请求的延迟率,参照计算公式2。
youngGc_per_min:表示每分钟young sc的数量,参照计算公式1。
youngGcAverage_per_min:表示母分钟young gC请求的延迟率,参照计算公式2。
oldGc_per_min:表示每分钟old gc的数量,参照计算公式1。
oldGcAverage_per_min:表示每分钟old gc请求的延迟率,参照计算公式2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

# 2.3 es的映射

映射是定义文档及其包含的字段如何存储在索引库中的过程。每个文档都是一个字段的集合,每个字段都有各自的数据类型,映射数据时,可以创建一个映射的定义,其中包含与文档相关字段的列表。映射定义还包括元数据字段(_source),他定义如何处理文档关联的元数据,而es支持动态映射和显式映射。每种方法根据不同的使用情况有不同的好处。如果要明确定义映射或者更好地控制创建字段和字段类型,则可以利用es的显示映射。动态映射和显式映射的详细说明如下

  • 动态映射方便用户快速写入索引数据,es会根据写入的文档内容自动添加字段和字段类型,用户只负责写入具体的数据即可
  • 显式映射需要用户精确地选择如何定义映射,例如哪些字符串字段应被视为全文字段,哪些字段是数字或者日期格式。显式索引是用于控制动态添加字段映射的自定义规则,而且在显示映射中使用runtime(运行时映射)时无需重新创建索引就可以更改数据存储的规则
# 2.3.1 动态映射

动态映射是es非常重要的功能之一,使用户不需要关注存储结果,能够在业务中尽快使用数据进行搜索。使用动态银蛇在写入索引文档数据时,不需要先创建索引和定义字段,索引中的字段和字段类型都将自动创建

PUT datadb/_doc/1
{"count": 10}
1
2

以上语句创建了一个名为datadb的索引库,然后为此索引库添加count字段,该字段的数据类型是long,而long类型都是动态映射自动生成的。我们可以使用GET datadb语句进行查询。

elasticsearch在用户写入数据时检测到新的字段时,会动态地将该字段添加到类型映射中,由dynamic参数来控制此行为。用户可以通过将dynamic参数设置为true或明确指示elasticsearch根据传入的文档来动态创建字段。

映射规则

JSON数据类型 "dynamic":"ture" "dynamic":"runtime"
true或者false boolean boolean
double类型 float double
integer类型 long long
object类型 object object
array类型 取决于数组的第一个元素值 取决于数组的第一个元素值
日期类型 date date
数字类型 float或者long double或者long
日期和数字之外的类型 带有.keyword子字段的文本 keyword
# 2.3.1.1 日期检测
# 2.3.1.2 禁用日期检测
# 2.3.1.3 自定义日期检测格式
# 2.3.1.4 数字检测

# 2.3.2 动态映射模板

动态映射模板使得在默认的动态字段映射规则之外能够更好地控制es如何映射数据。用户可以通过将dynamic参数设置为true来启用动态映射模式,然后使用动态模板来定义自定义映射,这些映射可以根据匹配条件应用于动态添加的字段。相关参数如下

  • match_mapping_type:表示对es检测到的数据类型进行操作
  • match和unmatch:表示使用模式匹配来匹配字段名称

# 3.es字段类型

==常用类型==

  • binary:表示可以存储编码为base64的字符串或者二进制值
  • boolean:表示可以存储true和false的布尔值
  • keyword:该字段类型的数据再存储时不会进行分词处理,适合进行统计分析,不能进行全文搜索
  • numbers:用于表示数字类型,例如long和double
  • date:表示可以存储日期类型的数据
  • alias:表示为现有字段定义别名
  • text:该字段类型的数据再存储时会进行分词并建立索引,适合进行全文搜索,不能进行统计分析

==对象和关系类型==

  • object:表示一个json对象
  • nested:嵌套类型,对象中可以嵌套对象
  • array:在es中,数组不需要专用的字段类型,默认情况下,任何字段都可以包含0个或多个值,但是数组中的所有值必须具有相同的字段类型

==其余类型==

  • range:表示范围类型
  • rank_feature:表示排名类型
  • token_count:表示令牌计数类型
  • ip:用于ip地址的存储和查询的类型
  • geo_point,geo_shape:用于地理位置和空间位置存储和搜索的类型

# 3.1 alias类型

# 创建名为userinfo的索引库并为其创建映射关系
PUT userinfo
{
	"mappings":{
		"properties":{
			"age":{
				"type":"long"
			},
			"aliasage":{
				"type":"alias",
				"path":"age"
			},
			"transit_mode":{
				"type":"keyword"
			}
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

以上语句创建了userinfo索引库,而且为age字段创建了名为aliasage的别名

# 在索引库userinfo中插入一条文档数据
PUT userinfo/_doc/1
{
	"age":39,
	"transit_mode":"transit_mode"
}
# 通过别名查询年龄大于30的用户信息
GET userinfo/_doc/_search
{
	"query":{
		"range":{
			"aliasage":{
				"gte": 30
			}
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

在使用别名的时候需要注意,可以使用别名进行数据的搜索,但是不能使用别名进行数据的写入

# 3.2 数组类型

在es中,没有专用的数组数据类型。默认情况下,任何字段都可以包含0个或多个值,不过数组中的所有值必须具有相同的数据类型

# 3.3 binary类型

binary定义的字段类型可以存储编码为Base64的字符串或者二进制值

# 3.4 布尔类型

# 3.5 日期类型

# 3.6 nested类型

Last Updated: 7/24/2025, 4:36:33 PM