ElasticSearch 查询基于数组中活动日期元素的文档

ElasticSearch query for documents based on active date element in array

我有一个 ElasticSearch 索引,其中的数据按我复制粘贴到底部的方式编入索引。

思路是它有文档,文档的"official name",在一个数组中。这是因为文件的官方名称有一段时间有效(即2014-2015年的名称是X,2016-2018年的是Y)。

我想要的是一个简单的查询,它根据 name 属性查找文档,但它在今天有效。

文档图:

"Company": {
        "properties": {
          "vatNumber": {
            "type": "string"
          },
          "names": {
            "type": "nested",
            "include_in_parent": true,
            "properties": {
              "name": {
                "type": "string"
              },
              "period": {
                "properties": {
                  "validFrom": {
                    "type": "date",
                    "format": "dateOptionalTime"
                  },
                  "validTo": {
                    "type": "date",
                    "format": "dateOptionalTime"
                  }
                }
              },
              "lastUpdated": {
                "type": "date",
                "format": "dateOptionalTime"
              }
            }
          }}}

我的尝试:

我使用 NEST(.NET 客户端)。我假设总共有 2 个 "challenges":

  1. 我需要引用数组中的 属性 (name)
  2. 我需要 检查 validTo 确实是 null (并忽略另一个 数组中的实体)

然而,经过搜索,我对这两个很迷茫!

您正在寻找的是嵌套查询,您可以在其中指定嵌套字段的路径(此处为 names.name 和 names.period.validTo)。要检查字段是否为空,您可以在 bool 查询的 must_not 子句中使用 exists 查询。这是一个示例

GET /_search

{
    "query": {
        "nested" : {
            "path" : "names",
            "query" : {
                "bool" : {
                    "must":{
                        "term": {
                            "names.name": "Lars"
                        }
                    },
                    "must_not" :{
                        "exists": {
                            "field": "names.period.validTo"
                        }
                    }
                }
            }
        }
    }
}