首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹性单据数据比对问题

弹性单据数据比对问题
EN

Stack Overflow用户
提问于 2018-02-23 23:33:39
回答 1查看 228关注 0票数 0

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

代码语言:javascript
复制
{
    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?这很简单

代码语言:javascript
复制
{
  "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

EN

回答 1

Stack Overflow用户

发布于 2018-02-23 23:43:17

试试这些:

对于第二个查询:

代码语言:javascript
复制
{
  "size": 1,
  "query": {
    "bool": {
      "filter": [
        {
          "exists": {
            "field": "FirstJobEndDate"
          }
        }
      ],
      "must_not": [
        {
          "exists": {
            "field": "SecondJobStartDate"
          }
        },
        {
          "exists": {
            "field": "SecondJobEndDate"
          }
        },
        {
          "exists": {
            "field": "ThirdJobStartDate"
          }
        }
      ]
    }
  }
}

对于第三个查询:

代码语言:javascript
复制
{
  "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"
          }
        }
      ]
    }
  }
}

对于第四个查询:

代码语言:javascript
复制
{
  "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"
          }
        }
      ]
    }
  }
}

提示:正如您所看到的,您需要利用脚本,这可能会影响性能。因为您事先知道要比较哪些日期,所以应该将日期差异存储在其他标量字段中,以便以后可以轻松地与range查询进行比较。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48951313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档