Elasticsearch:按日期和时间过滤为不同的字段

时间:2015-11-03 20:03:24

标签: elasticsearch

我正在尝试使用日期范围和时间范围为我的查询创建过滤器。就我而言,日期和时间是不同的领域。所以我想运行这样的查询:告诉我本月10:00:00到12:00之间发生的所有事件(15-10-01 / 15-10-30)

这是我的查询,但它不起作用。注意:如果我只使用"日期部分"它有效,但结合时间字段,结果是错误的。

有什么建议吗?

{"query": {
    "filtered": {
         "query": {
             "match": { "message" : "error" }
         },
         "filter": {
             "bool" : {
                 "must" : {
                     "range": {
                         "date": {
                             "gte": "15-11-01",
                             "lte": "15-11-30"
                         }
                     }
                 },
                 "must" : {
                     "range": {
                         "time": {
                             "gte": "10:00:00",
                             "lte": "12:00:00"
                         }
                 }
             }
         }
     }
  }
}
}

更新:运行命令:

curl -XGET localhost:9200/my_index/_mapping

正如你们中的一些人所说,我发现ES正在定义"时间"字段类型为字符串而不是(日期)时间。 另外,正如第一个答案所指出的,我的查询语法错误。

1 个答案:

答案 0 :(得分:0)

有些不正确的事情是您的must过滤器中有两个bool条款。这不是有效的JSON,因此可能是您的查询不起作用的原因,请尝试使用以下查询,而range过滤器中包含两个bool/must过滤器:

{
  "query": {
    "filtered": {
      "query": {
        "match": {
          "message": "error"
        }
      },
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "date": {
                  "gte": "15-11-01",
                  "lte": "15-11-30"
                }
              }
            },
            {
              "range": {
                "time": {
                  "gte": "10:00:00",
                  "lte": "12:00:00"
                }
              }
            }
          ]
        }
      }
    }
  }
}