es底层原理


正排索引(doc values) 和倒排索引

  1. 概念: 从广义来说,doc 是掠视本质上是一个序列化的列式存储。列式存储适用于聚合、排序、脚本等操作,所有的数字、地理坐标、日期、IP、和不分析字段类型都会默认开启。
  2. 特点: 倒排索引的优势在于查找包含某个项的文档,相反,如果用它确定哪些项是否存在单个文档里,性能较差。
  3. 优化: es官方建议,es大量是基于os cache来进行缓存和提升性能的,不建议jvm内存来进行缓存,那样会导致一定的gc开销和oom问题,给jvm更小的内存,给os cache更大的内存。比如64G服务器,给jvm最多16G, os cache 可以提升doc values和倒排索引的缓存和查询效率。

倒排索引 : 字段分词,(key)词项-哪些doc,词项表
正排索引 : (key)doc_id-字段词项

  1. 倒排索引和正排索引都是在index-time(索引创建)的时候创建,都会缓存在内存中,前提是内存足够。
    keyword 为聚合而生,正排索引;type 倒排索引;

  2. 不分词的field会在index-time时生成正排索引,聚合时直接使用正排索引,而分词的field在创建索引时是没有正排索引的,如果没有创建doc values 的字段需要做聚合查询,name需要将fileddata打开,设置为true。

  3. doc value 使用非jvm内存,gc友好。

fielddata 默认false,慎用
确定不使用聚合查询 doc_values 设置为false,确定只是用聚合分析 index 设置为false

基于mget批量查询以及基于bulk的批量增删改

  1. 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
    70
    GET /_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"]
    }
    }
    ]
    }

  2. bulk: 批量增删改 no-query

    1
    2
    3
    4
    5
    6
    POST /_bulk

    POST/index/_bulk
    {"action":{"metedata"}}
    {"data"}

  • Operate:
  1. create: PUT /index/_create/id/. 强制创建(是否制定id)
  2. delete: lazy delete原理
  3. index: 可以是创建,也可以是全量替换
  4. update: partial update(全量替换 部分替换)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
POST /bulk?filter_path=items.*.error # 返回的结果只包含错误的结果
{"create":{"index":"product","_id":1}}
{"name":"_buld create1"}
{"create":{"index":"product","_id":11}}
{"name":"_buld create11"}



###
POST /bulk
{"update":{"index":"product","_id":11,"retry_on_conflict":"3"}}#当并发冲突时,尝试3次
{"name":"_buld create11"}


###
POST /bulk
{"index":{"index":"product","_id":11,"retry_on_conflict":"3"}}#当并发冲突时,尝试3次
{"name":"_buld create11"}

ES并发冲突问题(悲观锁和乐观锁)

  1. 悲观锁:各种情况都加锁,读写锁、行级锁、表级锁、使用简单,但是并发能力差

  2. 乐观锁:并发能力高,操作麻烦,每次no-query操作都需要对比version(ES 使用乐观锁)


文章作者: TheMoonLight
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 TheMoonLight !
评论
  目录