弹性搜索2.3查询问题

时间:2018-07-12 13:13:39

标签: elasticsearch aws-elasticsearch

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

2 个答案:

答案 0 :(得分:2)

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

此外,过滤器的语法不正确。请参阅filter contextpost 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"}}}