首页 > 解决方案 > ElasticSearch:查询今天是否在列表中的开始日期和结束日期之间

问题描述

如果我有一些包含多组开始/结束日期的字段的数据.. 例如:

{
     id: 1,
     title: "My Title",
     availability[{start: 01-01-2020, end: 01-05-2020},{start: 02-01-2020, end: 02-22-2020}]
}

在弹性搜索中是否可以构建查询以检查今天(或任何给定日期)是否属于列表中的任何开始/结束日期组合?

或者我是否需要以不同的方式构建我的数据以使其工作?

以前,我只处理一个开始日期和一个结束日期,并且可以将它们存储为自己的字段并执行 gte、lte 组合来检查。

更新:

如果我将它们添加为嵌套字段。例如:

"avails" : {
    "type" : "nested",
    "properties" : {
        "availStart" : { "type" : "date" },
        "availEnd" : { "type" : "date" }
    }
}

如果我这样搜索:

{
    "query": {
        "nested" : {
            "path" : "avails",
            "query" : {
                "term" : {
                    { "range" : {"avails.start" : {"lte": "now"}}},
                    { "range" : {"avails.end" : {"gt" : "now"}}}
                }
            }
        }
    }
}

它会为每个嵌套记录评估这个并返回任何具有匹配子记录的父记录吗?

标签: elasticsearchaws-elasticsearch

解决方案


很高兴您选择了nested字段。现在您只需要确保映射、字段名称和查询都是一致的。

  1. 日期映射包括format
PUT myindex
{
  "mappings": {
    "properties": {
      "avails": {
        "type": "nested",
        "properties": {
          "start": { "type": "date", "format": "MM-dd-yyyy" },
          "end": { "type": "date", "format": "MM-dd-yyyy" }
        }
      }
    }
  }
}
  1. 同步您的文档
POST myindex/_doc
{
  "id": 1,
  "title": "My Title",
  "avails": [
    {
      "start":"01-01-2020",
      "end": "01-05-2020"
    },
    {
      "start": "02-01-2020",
      "end": "02-22-2020"
    }
  ]
}
  1. 最后是查询。你的格式不正确——如果你想要一个逻辑 AND,你需要将range查询包装在一个bool+中must
POST myindex/_search
{
  "query": {
    "nested": {
      "path": "avails",
      "query": {
        "bool": {
          "must": [
            { "range" : {"avails.start" : {"lte": "now"}}},
            { "range" : {"avails.end" : {"gt" : "02-01-2020"}}}
          ]
        }
      }
    }
  }
}

推荐阅读