排序的过程
排序是针对字段原始内容进行的,倒排索引无法发挥作用
需要用到正排索引,通过文档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==" }