elasticsearch 弹性单据日期比较问题,elasticsearch,elasticsearch-2.0,elasticsearch,elasticsearch 2.0" /> elasticsearch 弹性单据日期比较问题,elasticsearch,elasticsearch-2.0,elasticsearch,elasticsearch 2.0" />

elasticsearch 弹性单据日期比较问题

elasticsearch 弹性单据日期比较问题,elasticsearch,elasticsearch-2.0,elasticsearch,elasticsearch 2.0,我有一个包含数千个这样的文档的弹性索引 { Name: John Doe, FirstJobStartDate: 8/9/2016, FirstJobEndDate:1/4/2019, SecondJobStartDate:7/4/2019, SecondJobEndDate:8/8/2020, ThirdJobStartDate: 1/9/2020, } 除Name&FirstJobStartDate外,任何其他字段都是可选的,并且可能存在于文

我有一个包含数千个这样的文档的弹性索引

{
    Name: John Doe,
    FirstJobStartDate: 8/9/2016,
    FirstJobEndDate:1/4/2019,
    SecondJobStartDate:7/4/2019,
    SecondJobEndDate:8/8/2020,
    ThirdJobStartDate: 1/9/2020,
}
除Name&FirstJobStartDate外,任何其他字段都是可选的,并且可能存在于文档中,也可能不存在于文档中

我需要4个号码:

1) 有多少个文档具有FirstJobEndDate? 那很容易

{
  "size":1,    
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "FirstJobEndDate"
              }
            }
          ]
        }
      }
    }
  }
}
现在情况变得复杂了:

2) 有多少文档的FirstJobEndDate小于当前日期,但它们甚至没有一个(SecondJobStartDate、SecondJobEndDate或ThirdJobStartDate)

3) 有多少个文档具有FirstJobEndDate,还具有(SecondJobStartDate、SecondJobEndDate、ThirdJobStartDate)中的任意一个,并且这些日期中的任何一个都在FirstJobEndDate的1年内

4) 有多少文档有FirstJobEndDate,也有(SecondJobStartDate、SecondJobEndDate、ThirdJobStartDate)中的任何一个,并且这些日期都不在FirstJobEndDate的1年内

我相信这可以通过“必须”和“应该”的正确组合来实现,但由于同一文档中两个日期之间的比较,无法得到任何明确的解决方案

请确认,所有日期都是有效的弹性日期类型字段,而不是字符串

任何帮助都将不胜感激。 弹性版本:2.4

对于第二个查询:

{
  "size": 1,
  "query": {
    "bool": {
      "filter": [
        {
          "exists": {
            "field": "FirstJobEndDate"
          }
        }
      ],
      "must_not": [
        {
          "exists": {
            "field": "SecondJobStartDate"
          }
        },
        {
          "exists": {
            "field": "SecondJobEndDate"
          }
        },
        {
          "exists": {
            "field": "ThirdJobStartDate"
          }
        }
      ]
    }
  }
}
对于第三个查询:

{
  "size": 1,
  "query": {
    "bool": {
      "filter": [
        {
          "exists": {
            "field": "FirstJobEndDate"
          }
        }
      ],
      "minimum_should_match": 1,
      "should": [
        {
          "script": {
            "script": "doc.SecondJobStartDate.date != null && doc.SecondJobStartDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
          }
        },
        {
          "script": {
            "script": "doc.SecondJobEndDate.date != null && doc.SecondJobEndDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
          }
        },
        {
          "script": {
            "script": "doc.ThirdJobStartDate.date != null && doc.ThirdJobStartDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
          }
        }
      ]
    }
  }
}
{
“大小”:1,
“查询”:{
“布尔”:{
“过滤器”:[
{
“存在”:{
“字段”:“FirstJobEndDate”
}
}
],
“最小应匹配”:1,
“应该”:[
{
“脚本”:{

“脚本”:“doc.SecondJobStartDate.date!=null&&doc.SecondJobStartDate.date.getMillis()-doc.FirstJobEndDate.date.getMillis()谢谢Val。这很有帮助。我尝试了这些查询,它们都能正常工作。唯一的问题是,即使字段不存在,脚本也会返回true。例如,我没有ThirdJobStartDate,那么“应该”条件会返回true,因为NA-X<1年。重复,请参见上面的注释。我添加了一个空检查,如果有n,请重试除此之外,您可以结束此问题,谢谢。
{
  "size": 1,
  "query": {
    "bool": {
      "filter": [
        {
          "exists": {
            "field": "FirstJobEndDate"
          }
        }
      ],
      "must_not": [
        {
          "script": {
            "script": "doc.SecondJobStartDate.date != null && doc.SecondJobStartDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
          }
        },
        {
          "script": {
            "script": "doc.SecondJobEndDate.date != null && doc.SecondJobEndDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
          }
        },
        {
          "script": {
            "script": "doc.ThirdJobStartDate.date != null && doc.ThirdJobStartDate.date.getMillis() - doc.FirstJobEndDate.date.getMillis() <= 31540000000"
          }
        }
      ]
    }
  }
}