我有时间序列数据,我想通过使用固定的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"
}
}
}
}
}
答案 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