ES-排序及Doc Values &FieldData

排序的过程

排序是针对字段原始内容进行的,倒排索引无法发挥作用

需要用到正排索引,通过文档Id和字段快速得到字段原始内容

ES有两种实现方法

feilddata:搜索时动态创建,使用大量内存和cpu,但是索引速度快

doc values(列式存储 对text无效):新增文档时创建,占用存储空间,索引速度慢,但是减少了内存的占用

默认开启,可以通过mapping进行关闭,关闭后该字段不可进行排序和聚合,但是搜索速度快,占用空间小,只有明确该字段不需要进行排序和聚合的时候才可以对该字段关闭doc values

//单字段排序
GET scrm_customer_1263757224229081088/_search
{
  "size": 5, 
  "_source": "last_trade_time", 
"query": {
  "match_all": {}
},
"sort": [
  {
    "last_trade_time": {
      "order": "desc"
    }
  }
]
}

//多字段排序
GET scrm_customer_1263757224229081088/_search
{
  "size": 5, 
  "_source": "last_trade_time", 
"query": {
  "match_all": {}
},
"sort": [
  {
    "last_trade_time": {
      "order": "desc"
    }
  },
  {
    "_score":{
      "order": "desc"
    }
  }
]
}

//设置doc values
PUT tests
{
  "mappings": {
    "properties": {
      "content":{
        "type": "keyword",
        "doc_values": false
      }
    }
  }
}

分页与遍历:from-size/search after/scroll api

from-size:深度搜索会带来性能问题,原因的由于分片导致的,比如查询1000-100页,这个时候es主分片会将查询分配到数据分片上进行查询,每个数据分片都会进行1000-100页的查询,比如有3个数据分片,这样的话就会产生3300条数据到主分片上,然后主分片再进行过滤,最后剩下100条数据进行返回

es默认设置10000条数据作为限制,也就是from+size最大只能等于10000

search after:避免深度分页的性能问题,可以实时获取下一页文档信息,不支持指定页数,只能往下翻页,

第一步搜索需要指定sort 并且保证sort的字段值是唯一的,可以通过Id确保唯一性

然后使用上一次最后一个文档的sort值进行查询

GET scrm_customer_1263757224229081088/_search
{
  "size": 5, 
  "_source": "last_trade_time", 
"query": {
  "match_all": {}
},
"sort": [
  {
    "last_trade_time": {
      "order": "desc"
    }
  },
  {
    "_id":{
      "order": "desc"
    }
  }
]
}

//然后取出上次查询的最后一个sort字段的值放入到search_after中
GET scrm_customer_1263757224229081088/_search
{
  "size": 5, 
  "_source": "last_trade_time", 
"query": {
  "match_all": {}
},
"search_after":[
          20210323171247,
          "0fef7cc19ddcd771e735b599a519055e0"
        ],
"sort": [
  {
    "last_trade_time": {
      "order": "desc"
    }
  },
  {
    "_id":{
      "order": "desc"
    }
  }
]
}

scroll api:创建一个快照,有新的数据写入的时候查询不到新数据

每次查询输入上次的scroll id

GET scrm_customer_1263757224229081088/_search?scroll=5m
{
  "size": 1, 
  "_source": "last_trade_time", 
"query": {
  "match_all": {}
},
"sort": [
  {
    "last_trade_time": {
      "order": "desc"
    }
  },
  {
    "_id":{
      "order": "desc"
    }
  }
]
}
结果:
{
  "_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAHdwAWWjh2clE1cF9RRktVbEdZRXFlSzBFQQ==",
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 48,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "scrm_customer_1263757224229081088",
        "_type" : "_doc",
        "_id" : "100088f0f0f1984c197c534f43e78b4f517",
        "_score" : null,
        "_source" : {
          "last_trade_time" : 20210324115555
        },
        "sort" : [
          20210324115555,
          "100088f0f0f1984c197c534f43e78b4f517"
        ]
      }
    ]
  }
}

利用scroll进行查询
GET /_search/scroll
{
  "scroll":"1m",
  "scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAHdwAWWjh2clE1cF9RRktVbEdZRXFlSzBFQQ=="
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值