弹性搜索 2.3 查询问题

Elastic search 2.3 query issue

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

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

此外,过滤器的语法不正确。参见 filter context or post filter。这是前者的查询:

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

如果 SensorId 上的检查是完全匹配并且实际上不需要任何评分,您可能需要进一步优化查询,同时在过滤器中移动匹配项。

问题也可能出在日期范围格式上。尝试给定 "gte": "now-50d/d", "lt": "now/d" 可能不起作用。在我们的例子中,列中的时间采用 POSIX 格式,因此类似于 'long' 数字。在这种情况下,您可以尝试将日期范围指定为:

 {"range": {"StartDateTime": {"gte": "1531108114", "lt": "1531280914"}}}