好的!为了更清楚地说明`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

最低0.47元/天 解锁文章
44

被折叠的 条评论
为什么被折叠?



