按未找到的现有字段搜索 Elasticsearch 文档但该字段存在

Searching Elasticsearch document by existing field not found but the field exists

首先,我必须声明我使用的是 Elasticsearch 5.6.16

我想弄清楚这里发生了什么。我有几个文档用这个映射索引(我直接从 Kibana 复制文档):

{
  "_index": "my_index",
  "_type": "doc",
  "_id": "Outbreak_10346",
  "_version": 1,
  "_score": 1,
  "_source": {
    "outbreakId": 10346,
    "reference": "XX-AD-2021-00003",
    "countryCode": "BE",
    "adisNotificationReasonType": {
      "code": "TERRESTRIAL"
    },
    "approximateLocation": false,
    "latitude": 50.93766,
    "longitude": 3.97156,
    "adminZoneLevelOne": {
      "zoneId": 40,
      "zoneCode": "BE2"
    },
    "affectedSpecies": [
      {
        "speciesId": 16703,
        "name": "Swine",
        "measuringUnit": "ANIMAL",
        "casesQuantity": 10,
        "deadQuantity": 1,
        "susceptibleQuantity": 100,
        "isAquatic": false
      }
    ],
    "affectedSpeciesTotalSusceptible": 100,
    "affectedSpeciesTotalCases": 10
  }
}

如果我在 Kibana 中执行此查询:

GET my_index/_search
{
  "query": {
    "exists": {
      "field": "adminZoneLevelOne"
    }
  }
}

我没有得到任何结果。但是,如果我将字段更改为任何其他字段,我会找到文档。 此外,当我检索文档时,我可以访问 adminZoneLevelOne 字段。

这怎么可能?为什么 Elasticsearch 找不到包含该字段的任何文档?

adminZoneLevelOne 字段的索引映射是:

  "adminZoneLevelOne": {
    "type": "nested",
    "properties": {
      "zoneCode": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        },
        "analyzer": "WHITESPACE"
      },
      "zoneId": {
        "type": "long"
      }
    }
  }

对于 adisNotificationReasonType 来说效果很好的是:

  "adisNotificationReasonType": {
    "properties": {
      "code": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        },
        "analyzer": "LOWERCASE_KEYWORD"
      }
    }
  }

由于adminZoneLevelOne是嵌套类型,你需要使用exists查询和nested query as

    {
  "query": {
    "nested": {
      "path": "adminZoneLevelOne",
      "query": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "adminZoneLevelOne"
              }
            }
          ]
        }
      }
    }
  }
}