【问题标题】:Return every nth record in Elastic Search返回 Elastic Search 中的每 n 条记录
【发布时间】:2017-02-14 17:32:55
【问题描述】:

我有时间序列数据,我想使用具有固定 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 条记录? 我找到了一些过滤器脚本,但它们似乎都不起作用。

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

编辑:返工查询,因为过滤已被布尔替换:

  {
   "_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"
            }
         }
      }
   }
}

【问题讨论】:

标签: elasticsearch


【解决方案1】:

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

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

      "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

【讨论】:

  • 非常感谢。我尝试了这种方法,但语法没有运气。我必须将它放在我的查询中的什么位置?
  • 我已经添加了语法。虽然无法测试它。试一下。你可能需要做一些小的调整。让我知道它是否有效。
  • 嘿,非常感谢...我发现我不得不返工一些东西,因为过滤器被“布尔”取代了。
  • 我删除了“param”部分,因为有一个错误 [script] query does not support [params],我真的不知道为什么!
  • 在原版中进行了上述修复。发布它工作!再次感谢您的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
相关资源
最近更新 更多