【问题标题】:ElasticSearch: Querying if today is between and series of start and end dates in listElasticSearch:查询今天是否介于列表中的开始日期和结束日期之间
【发布时间】:2021-01-25 16:32:31
【问题描述】:

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

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

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

或者我是否需要以不同的方式构建我的数据才能使其发挥作用?

以前,我只处理一个开始日期和一个结束日期,可以将它们存储为自己的字段并执行 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"}}}
                }
            }
        }
    }
}

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

【问题讨论】:

  • 您的数据代表什么?日期时段是重复的还是固定的?
  • 它们代表可用性窗口。一旦插入数据,它们就会被修复,但更新可能会通过更改现有值或添加新值来实现。

标签: elasticsearch aws-elasticsearch


【解决方案1】:

很高兴您选择了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"}}}
          ]
        }
      }
    }
  }
}

【讨论】:

  • 这个@kaz 运气好吗?
  • 是的,刚刚完成实施和测试。工作完美,谢谢!认为我只需要围绕嵌套数据和查询进行思考,您的示例帮助很大。谢谢!
  • 很好,我很高兴它有效!嘿,我正在写一本弹性搜索手册,如果我讨论的是真实的、非平凡的用例,就像你正在解决的那样。有一两章是关于嵌套字段的,我认为它会给你带来价值。我即将完成它,但let me know您还想了解什么,我会在手册发布时通知您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多