Elasticsearch 嵌套匹配查询不返回任何结果

时间:2021-04-23 18:49:34

标签: elasticsearch

我对 ElasticSearch 并不陌生,但这个看似简单的查询返回的结果为零,这令人困惑。弹性版本 7.10.2。

映射:

{
    "test-index-v43": {
        "mappings": {
            "properties": {
                "addresses": {
                    "type": "nested",
                    "properties": {
                        "address": {
                            "type": "text",
                            "store": true
                        }
                    }
                },
                "aliases": {
                    "type": "nested",
                    "properties": {
                        "alias_name": {
                            "type": "text",
                            "store": true
                        }
                    }
                },
                "identities": {
                    "type": "nested",
                    "properties": {
                        "identity": {
                            "type": "text",
                            "store": true
                        }
                    }
                }
            }
        }
    }
}

aliases 数组是此问题中唯一真正重要的数组,但希望提供完整映射以防万一。

查询:

GET test-index-v43/_search
{
    "query": {
        "nested": {
            "path": "aliases",
            "query": {
                "match": {
                    "aliases.alias_name": "Joseph Shmoseph"
                }
            }
        }
    }
}

没有返回结果,但是这个文档存在于索引中,所以不明白为什么不返回:

  {
    "_index" : "test-index-v43",
    "_type" : "_doc",
    "_id" : "1234",
    "_score" : 1.0,
    "_source" : {
      "alias_name" : "Joseph Shmoseph",
      "address" : {
        "houseNumber" : "123",
        "road" : "Main St.",
        "city" : "New York City",
        "postCode" : "12345-6789",
        "country" : "USA"
      }
    }
  }

我一定遗漏了一些明显的东西吗?

1 个答案:

答案 0 :(得分:1)

问题中给出的索引数据不符合定义的索引映射格式。没有 aliases 字段名称(定义为 nested 类型)。

由于您编入索引的数据没有 aliases 作为嵌套路径,因此当您尝试使用 "path": "aliases" 运行搜索查询时,它不会显示任何结果。

搜索查询不会抛出任何错误,因为您已经在索引映射中将 aliases 定义为嵌套类型。

Elasticsearch 使用动态映射来定义新字段(在索引新文档时添加),如果未定义索引映射,则运行以下搜索查询,您将获得结果

{
  "query": {
    "match": {
      "alias_name": "Joseph Shmoseph"
    }
  }
}

否则需要按照以下格式对数据进行索引

{
  "aliases": {
    "alias_name": "Joseph Shmoseph"
  }
}

现在运行相同的搜索查询(如问题所示)给出以下结果

"hits": [
      {
        "_index": "67235408",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.5753642,
        "_source": {
          "aliases": {
            "alias_name": "Joseph Shmoseph"
          }
        }
      }
    ]