ElasticSearch基于数组

时间:2018-03-11 21:02:03

标签: elasticsearch nest elasticsearch-net elasticsearch-dsl

我有一个ElasticSearch索引,数据在底部复制粘贴时被索引。

想法是它有文档,文档的“官方名称”在一个数组中。这是因为该文件的正式名称有效期为一段时间(即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客户端)。我假设有两个总体“挑战”:

  1. 我需要引用数组中的属性(name
  2. 我需要 检查validTo确实null(并忽略另一个) 数组中的实体)
  3. 然而,在四处寻找之后,我对这两个人感到非常失望!

1 个答案:

答案 0 :(得分:1)

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

GET / _search

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