【问题标题】:conditionally query for fields in elasticsearch有条件地查询elasticsearch中的字段
【发布时间】:2021-01-20 20:02:09
【问题描述】:

我是 Elasticsearch 的新手,在发布这个问题之前,我已经在谷歌上搜索过帮助,但不明白如何编写我想要编写的查询。

我的问题是我想要查询的文档很少,其中很少有字段“DueDate”,其中很少有“PlannedCompletionDate”,但不是都存在于单个文档中。所以我想写一个查询,它应该有条件地从文档中查询一个字段并返回所有文档。

例如,下面我正在证明每种类型的示例文档,并且我的查询应该从两个文档中返回结果,我需要编写查询来检查字段是否存在并返回文档

“_source”:{ ... "plannedCompleteDate": "2019-06-30T00:00:00.000Z", ... }

“_source”:{ ... "dueDate": "2019-07-26T07:00:00.000Z", ... }

【问题讨论】:

  • 忘了提及,在所有文档中,我有兴趣获取所有具有字段到期日期或计划完成日期的文档。这些文档都不会同时包含字段dueDate 和plannedCOmpletionDate。
  • 所以您想获取那些具有plannedCompleteDatedueDate 字段但不是这两个字段的文档?
  • 是的,并且这些文档都不会包含这两个字段。所以我的查询应该类似于“从文档中选择日期,如果它包含dueDate或plannedCompletionDate并且日期应该在'2020-01-01和'2020-12-31''之间”
  • 您的索引中是否有包含这两个字段的文档?
  • 不,我想,可以肯定的是,我怎样才能检查是否有任何此类文件?

标签: elasticsearch


【解决方案1】:

您可以使用range queryboolean query 的组合来实现您的用例。

添加一个包含索引映射、数据、搜索查询和搜索结果的工作示例

索引映射:

{
  "mappings": {
    "properties": {
      "plannedCompleteDate": {
        "type": "date",
        "format": "yyyy-MM-dd"
      },
      "dueDate": {
        "type": "date",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

索引数据:

{
  "plannedCompleteDate": "2019-05-30"
}
{
  "plannedCompleteDate": "2020-06-30"
}
{
  "dueDate": "2020-05-30"
}

搜索查询:

{
  "query": {
    "bool": {
      "should": [
        {
          "range": {
            "plannedCompleteDate": {
              "gte": "2020-01-01",
              "lte": "2020-12-31"
            }
          }
        },
        {
          "range": {
            "dueDate": {
              "gte": "2020-01-01",
              "lte": "2020-12-31"
            }
          }
        }
      ]
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "65808850",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "plannedCompleteDate": "2020-06-30"
        }
      },
      {
        "_index": "65808850",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "dueDate": "2020-05-30"
        }
      }
    ]

【讨论】:

  • @Sunil Yerra 请仔细阅读答案,如果这是问题,请告诉我?
  • 感谢您的快速帮助,我会试试这个并告诉您我的经验。
  • 当然@Sunil Yerra,期待您的反馈:)
  • 感谢您的帮助,它成功了。我现在能够增强该查询以获得更有用的结果。谢谢兄弟。
  • 我的范围应该小于现在,在示例中我给出了一些日期供参考....下面是对我有用的查询 { "bool": { "should": [ { "范围”:{“dueDate”:{“lt”:“now”}}},{“range”:{“plannedCompleteDate”:{“lt”:“now”}}}]}}
猜你喜欢
  • 2014-11-09
  • 2022-01-09
  • 2016-05-28
  • 1970-01-01
  • 2022-01-19
  • 2016-08-18
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多