正排索引(doc values) 和倒排索引
- 概念: 从广义来说,doc 是掠视本质上是一个序列化的列式存储。列式存储适用于聚合、排序、脚本等操作,所有的数字、地理坐标、日期、IP、和不分析字段类型都会默认开启。
- 特点: 倒排索引的优势在于查找包含某个项的文档,相反,如果用它确定哪些项是否存在单个文档里,性能较差。
- 优化: es官方建议,es大量是基于os cache来进行缓存和提升性能的,不建议jvm内存来进行缓存,那样会导致一定的gc开销和oom问题,给jvm更小的内存,给os cache更大的内存。比如64G服务器,给jvm最多16G, os cache 可以提升doc values和倒排索引的缓存和查询效率。
倒排索引 : 字段分词,(key)词项-哪些doc,词项表
正排索引 : (key)doc_id-字段词项
倒排索引和正排索引都是在index-time(索引创建)的时候创建,都会缓存在内存中,前提是内存足够。
keyword 为聚合而生,正排索引;type 倒排索引;不分词的field会在index-time时生成正排索引,聚合时直接使用正排索引,而分词的field在创建索引时是没有正排索引的,如果没有创建doc values 的字段需要做聚合查询,name需要将fileddata打开,设置为true。
doc value 使用非jvm内存,gc友好。
fielddata 默认false,慎用
确定不使用聚合查询 doc_values 设置为false,确定只是用聚合分析 index 设置为false
基于mget批量查询以及基于bulk的批量增删改
mget:批量查询
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70GET /_mget
{
"docs":
[
{
"_index":"prodect",
"_id":1
},
{
"_index":"prodect",
"_id":2
}
]
}
GET /prodect/_mget
{
"docs":
[
{
"_id":1
},
{
"_id":2
}
]
}
GET /prodect/_mget
{
"ids":[1,2]
}
#source
GET /product/_mget
{
"docs":
[
{
"_id":1,
"_source":false
},
{
"_id":2,
"_source":
[
"name","price"
]
}
]
}
GET /product/_mget
{
"docs":
[
{
"_id":2,
"_source":
{
"include":["name"],
"exclude":["name"]
}
}
]
}bulk: 批量增删改 no-query
1
2
3
4
5
6POST /_bulk
POST/index/_bulk
{"action":{"metedata"}}
{"data"}
- Operate:
- create: PUT /index/_create/id/. 强制创建(是否制定id)
- delete: lazy delete原理
- index: 可以是创建,也可以是全量替换
- update: partial update(全量替换 部分替换)
1 | POST /bulk?filter_path=items.*.error # 返回的结果只包含错误的结果 |
ES并发冲突问题(悲观锁和乐观锁)
悲观锁:各种情况都加锁,读写锁、行级锁、表级锁、使用简单,但是并发能力差
乐观锁:并发能力高,操作麻烦,每次no-query操作都需要对比version(ES 使用乐观锁)