日期过滤弹性搜索

时间:2015-07-16 08:48:03

标签: date search range elasticsearch

我尝试使用以下语法在弹性搜索上创建范围过滤器:

{
"size": 100,
"filter": {
"and": {
  "filters": [
    {
      "range": {
        "listingDate": {
          "gt": "15/07/2017 16:08:53"
        }
      }
    }
  ]
}
}
}

数据格式为:

"listingDate": "07/07/2015 09:30:00",

但是,无论过滤器属性如何,弹性搜索都会返回相同的错误结果。我尝试添加以下格式:

"format": "dd/MM/yyyy HH:mm:ss"

但我得到的结果不正确。

更全面的例子是:

{
"size": 100,
"sort": [
{
  "listingDate": {
    "order": "asc"
  }
}
],
"query": {
"bool": {
  "must": [
    {
      "query_string": {
        "query": "Event"
      }
    },
    {
      "range": {
        "listingDate": {
          "gte": "15/07/2015 16:08:53"
        }
      }
    },
    {
      "range": {
        "endDate": {
          "gte": "15/07/2015 16:08:53"
        }
      }
    }
  ]
}
},
"filter": {
"and": {
  "filters": [
    {
      "terms": {
        "departments": [
          "2393"
        ]
      }
    }
  ]
}
}
} 

2 个答案:

答案 0 :(得分:1)

在JSON文档中,日期表示为字符串。 Elasticsearch使用一组预配置格式来识别这些字符串并将其解析为一个长值,表示自UTC以来的毫秒级。您的日期字段可能未在预配置的ES日期formats集中列出。

默认情况下,将使用日期字段中指定的格式解析格式化日期,但可以通过将format参数传递给范围查询来覆盖它。

{
    "range" : {
        "listingDate" : {
            "gte": "07/07/2015 09:30:00",
            "format": "dd/MM/yyyy HH:mm:ss"
        }
    }
}

答案 1 :(得分:0)

让我们假设“ arr”参数的日期范围例如[“ 2019-07-10”,“ 2019-07-11”]

let start_date_query;
let range=[];
if ( arr.date_from ){

    if(arr.date_from[1]){

        range.push({

            "range":{
                "start_date":{ "gte":arr.date_from[0] }
           } 
        });

        range.push({

            "range":{
                "end_date":{ "lte": arr.date_from[1] }
           } 
        });

        start_date_query = {

                "query": {
                  "constant_score": {
                     "filter": {
                        "bool": {
                    "must":range
                }
            }
            }

        };

    }
 } 
}