我尝试使用以下语法在弹性搜索上创建范围过滤器:
{
"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"
]
}
}
]
}
}
}
答案 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
}
}
}
};
}
}
}