0

我正在对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。任何线索都会有所帮助。提前致谢。

4

2 回答 2

2

该错误通常是由于该字段不在映射中,即没有包含该字段的文档。检查索引是否为空或字段名称中是否有任何拼写错误。

此外,过滤器的语法不正确。请参阅过滤器上下文后过滤器。这是前者的查询:

{
  "query": {
    "bool": {
      "must": {"match": {"SensorId": "f0038c53272a"}},
      "filter": {"range": {"StartDateTime": {"gte": "now-50d/d", "lt": "now/d"}}}
    }
  },
  "sort":{"StartDateTime": "desc"}
}

如果检查SensorId是完全匹配并且不需要任何评分,您可能还需要进一步优化查询,将匹配项也移动到过滤器中。

于 2018-07-12T13:30:06.007 回答
0

问题也可能出在日期范围格式中。尝试给定 "gte": "now-50d/d", "lt": "now/d" 可能不起作用。在我们的例子中,列中的时间是 POSIX 格式的,所以就像一个“长”数字。在这种情况下,您可以尝试将日期范围指定为:

 {"range": {"StartDateTime": {"gte": "1531108114", "lt": "1531280914"}}}
于 2018-07-13T04:43:44.703 回答