【Elasticsearch】flattened`类型在查询嵌套数组时可能返回不准确结果的情况

好的!为了更清楚地说明`flattened`类型在查询嵌套数组时可能返回不准确结果的情况,我们可以通过一个具体的例子来展示。这个例子将展示如何在文档中没有完全匹配的嵌套对象时,`flattened`类型仍然可能返回该文档。

示例文档结构

假设你有以下文档结构,其中`addresses`是一个嵌套数组:

```json

PUT /my_index/_doc/1

{

  "user": {

    "id": 1,

    "name": "John Doe",

    "addresses": [

      {

        "street": "123 Main St",

        "city": "Anytown",

        "state": "NY" // 注意这里 state 是 NY,而不是 CA

      },

      {

        "street": "456 Elm St",

        "city": "Othertown",

        "state": "CA" // 注意这里 city 是 Othertown,而不是 Anytown

      }

    ]

  }

}

```

在这个文档中,`addresses`数组包含两个地址对象:

1. 第一个地址对象的`city`是`"Anytown"`,但`state`是`"NY"`。

2. 第二个地址对象的`state`是`"CA"`,但`city`是`"Othertown"`。

查询示例

假设你希望查询所有`city`为`"Anytown"`且`state`为`"CA"`的地址。如果`addresses`字段被定义为`flattened`类型,你可能会写出以下查询:

```json

GET /my_index/_search

{

  "query": {

    "bool": {

      "must": [

        {

          "term": {

            "user.addresses.city": {

              "value": "Anytown"

            }

          }

        },

        {

          "term": {

            "user.addresses.state": {

              "value": "CA"

            }

          }

        }

      ]

    }

  }

}

```

查询结果

由于`flattened`类型会将嵌套结构展开为多个字段路径,Elasticsearch 无法保证`city`和`state`属于同一个嵌套对象。因此,查询可能会返回不准确的结果。

在上面的例子中,`flattened`类型会将`addresses`展开为以下字段路径:

```json

{

  "user.addresses.street.0": "123 Main St",

  "user.addresses.city.0": "Anytown",

  "user.addresses.state.0": "NY",

  "user.addresses.street.1": "456 Elm St",

  "user.addresses.city.1": "Othertown",

  "user.addresses.state.1": "CA"

}

```

当你执行查询时,Elasticsearch 会分别匹配`city`和`state`,但无法保证它们属于同一个嵌套对象。因此,查询可能会返回包含以下内容的文档:

```json

{

  "hits": {

    "total": {

      "value": 1,

      "relation": "eq"

    },

    "max_score": 1.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值