在日志收集系统中,最近需要通过httpclient获取es中的日志信息,所以学习了一些es的查询语句方面的用法;
分页
分页的本质
分页的本质是从“大的数据集”中取出一部分。比如10000条记录,每页10条数据。取第二页即第11条到20条数据。ES或者数据库怎么知道哪些数据是第二部分(第2页),哪些是第三部分(第3页)呢?答案是ES或者数据库不知道,所以正确的分页必须要指定分页的顺序,即要有order by或者sort语句。
在ES中有三种方式可以实现分页:from+size、scroll、search_after
from+size
{
"size":10,
"from":0;
"query":{
"bool":{
"filter":{
"range":{
"beginTimeStr111":{
"gte":"2019-01-06T00:00:01.638Z",
"lte":"2019-01-06T23:59:59.330Z",
"time_zone":"+08:00"
}
}
},
"must":{
"match":{
//匹配的字段信息
}
}
}
},
在上述查询语句中,from字段的值表示的是从所有信息的第0行开始,找出size条的信息,如果需要找出第21到第30条的信息,则应该设置from = 21, size = 10.
在实际应用中,我们可以设置两者的数值大小,以适应不同的需求。
scroll(快照分页)
相对于from和size的分页来说,使用scroll可以模拟一个传统数据的游标,记录当前读取的文档信息位置。这个分页的用法,不是为了实时查询数据,而是为了一次性查询大量的数据(甚至是全部的数据)。因为这个scroll相当于维护了一份当前索引段的快照信息,这个快照信息是你执行这个scroll查询时的快照。在这个查询后的任何新索引进来的数据,都不会在这个快照中查询到。但是它相对于from和size,不是查询所有数据然后剔除不要的部分,而是记录一个读取的位置,保证下一次快速继续读取。
curl -XGET 'localhost:9200/twitter/tweet/_search?scroll=1m' -d '
{
"query": {
"match" : {
"title" : "elasticsearch"
}
}
}
//通过返回的scroll_id继续查找信息
curl -XGET '集群节点IP:9200/_search/scroll?scroll=1m&scroll_id=c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1'
该查询会自动返回一个_scroll_id,通过这个id(经过base64编码)可以继续查询
search_after
search_after参数通过提供实时游标来解决分页中遇到的消耗内存和时间增长问题。
检索第一页的数据后,
POST twitter/_search
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"sort": [
{"date": "asc"},
{"_id": "desc"}
]
}
上面的请求会为每一个文档返回一个包含sort排序值的数组。这些sort排序值可以被用于 search_after 参数里以便抓取下一页的数据。比如,我们可以使用最后的一个文档的sort排序值,将它传递给 search_after 参数:
GET twitter/_search
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"search_after": [1463538857, "654323"],
"sort": [
{"date": "asc"},
{"_id": "desc"}
]
}
当使用search_after时,from的属性值应该置为0或者-1,也可以不设置from这个属性。
返回字段
应用_source可以返回使用者想要返回的字段
{
"_source": {
"includes": [ "beginTimeStr111", "clientIP" , "executeTime","retCode","srvName"]
}
, "size": 40,
"from": 0
}
includes属性中表示的是想要获取的字段,excludes表示不想要的字段,
_source虽然很好用,但是它会占用很大的索引的存储空间,可以通过enabled false禁用