返回弹性搜索中的每第n条记录

时间:2017-02-13 16:11:28

标签: elasticsearch

我有时间序列数据,我想通过使用固定的2000条记录的时间范围来查询Elasticsearch。

我有这个查询

GET http://IP:9200/MYINDEX/_search
{ 
   "_source": ["XXX1", "XXX2","timestamp"],
    "sort" : 
        { "@timestamp" : {"order" : "asc"}},
    "query" : {
        "range" : {
            "@timestamp" : {
                "gte" : "2017-02-10T10:55:31,259Z",
                "lte" : "2017-02-10T10:55:32,272Z"
            }   
        }
}

是否可以仅返回每5或10条记录? 我找到了一些过滤器脚本,但似乎都没有。

由于一个索引中可能有数百万条记录,因此限制返回值的数量至关重要!

编辑:返工查询因为过滤被bool取代:

  {
   "_source":[
      "XXX1",
      "XXX2",
      "timestamp"
   ],
   "sort":{
      "@timestamp":{
         "order":"asc"
      }
   },
   "query":{
      "bool":{
         "must":{
            "range":{
               "@timestamp":{
                  "gte":"2017-02-10T10:55:31,259Z",
                  "lte":"2017-02-10T10:55:32,272Z"
               }
            }
         },
         "filter":{
            "script":{
               "script":"doc['@timestamp'].value % 5 == 0"
            }
         }
      }
   }
}

1 个答案:

答案 0 :(得分:1)

有一种方法可以做到这一点。您可以添加一个字段,其行为类似于DB的自动增量字段。

然后,您可以为要运行的查询添加过滤器。

      "filter": {
        "script": {
          "script": "doc['auto_increment'].value % n == 0",
          "params" : {
            "n" : 5
          }
        }
      }

这适用于具有时间序列数据并将搜索范围的索引。如果您在该字段中添加了文本搜索,则无法正常工作。

对于您正在尝试的查询,它将转换为类似的内容。

GET http://IP:9200/MYINDEX/_search
{ 
   "_source": ["XXX1", "XXX2","timestamp"],
    "sort" : 
        { "@timestamp" : {"order" : "asc"}},
    "query" : {
        "filtered": {
           "query": {
                "range" : {
                    "@timestamp" : {
                        "gte" : "2017-02-10T10:55:31,259Z",
                        "lte" : "2017-02-10T10:55:32,272Z"
               }   
           }  
           },
           "filter": {
               "script": {
                    "script": "doc['auto_increment'].value % 5 == 0"

        }
           }
        } 

}
}

如需参考,请查看this