我正在对python中的数据进行查询,
当我进行比赛并进行排序时,效果很好。
res = es.search( body={"size" : 100,
"query": {"match": {"SensorId": "f0038c53272a"}},
"sort":{"StartDateTime": "desc"}})
现在,当我介绍范围时,它会开始显示错误
res = es.search( body={"size" : 100,
"query": {"match": {"SensorId": "f0038c53272a"}},
"sort":{"StartDateTime": "desc"},
"range":{"StartDateTime":{"gte":"now-50d/d","lt": "now/d"}}})
它引发的错误是
elasticsearch.exceptions.RequestError:
TransportError(400, 'search_phase_execution_exception',
'No mapping found for [StartDateTime] in order to sort on')
Elasticsearch版本为2.3。任何线索都会有所帮助。预先感谢。
答案 0 :(得分:2)
该错误通常是由于字段不在映射中引起的,即,没有文档包含该字段。检查索引是否为空或字段名称中是否有错字。
此外,过滤器的语法不正确。请参阅filter context或post filter。这是前者的查询:
{
"query": {
"bool": {
"must": {"match": {"SensorId": "f0038c53272a"}},
"filter": {"range": {"StartDateTime": {"gte": "now-50d/d", "lt": "now/d"}}}
}
},
"sort":{"StartDateTime": "desc"}
}
如果对SensorId
的检查是完全匹配,并且实际上不需要任何评分,则您可能还需要进一步优化查询,从而在过滤器中移动匹配项。
答案 1 :(得分:0)
该问题也可能是日期范围格式。尝试给定“ gte”:“ now-50d / d”,“ lt”:“ now / d”可能不起作用。在我们的例子中,列中的时间采用POSIX格式,因此就像一个“长”数字。在这种情况下,您可以尝试将日期范围指定为:
{"range": {"StartDateTime": {"gte": "1531108114", "lt": "1531280914"}}}