查询操作:
项目升级过程中遇到的问题分页查询过慢:
初次的查询使用了深度分页(from-size)查询,当数据达到百万千万级别时,已经慢的让人忍无可忍。所谓深度查询就是涉及到大量 shard 的查询时,直接跳页到几千甚至上万页的数据,协调节点就有宕机的风险,毕竟协调节点需要将大量数据汇总起来进行排序,耗费大量的内存和 CPU 资源。所以慎用!尽可能用 Scroll API ,即只允许拿到下一页的信息,不允许跳页的情况出现,会避免这种情况的发生。
后来改用了快照分页(scroll),整个查询过程非常稳定,方差几乎可以忽略。该查询会自动返回一个_scroll_id,通过这个id(经过base64编码)可以继续查询。查询语句如下::9200/_search/scroll?scroll=1m&scroll_id=c2MkjsjskMkkssllasKKKOzM0NDg1ODpksksks5566HHsaskLLLqi692215。这个语句虽然很快,但是无法做到跳页查询,只能一页一页的查询。
快照分页参考代码如下:
1: var searchResponse = client.Search<ElasticsearchTransaction>(p => 2: p.Query(t => 3: t.Bool(l => l.Filter(f => f.DateRange(m => m.GreaterThanOrEquals(startTime).Field(d => d.PostDate))))) 4: .From(0) 5: .Size(Configurations.SyncSize) 6: .Index("archive") 7: .Sort(s => s.Ascending(a => a.PostDate)).Scroll("60s")); 8: 9: 10: while(某条件) 11: { 12: searchResponse = client.Scroll<ElasticsearchTransaction>("60s", searchResponse.ScrollId); 13: 14: //跳出循环的条件 15: }