elasticsearch 如何在Elastic中搜索嵌套在对象数组中的数组?

xoefb8l8  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(217)

我有一个Elastic索引,它包含的对象结构如下:

{
  dogs: [
    {
      name: 'wiener dog',
      id: 2,
      cats: [
        {
          name: 'mean cat',
          id: 5,
        },
        ...
      ],
    },
    ...
  ],
  ...
}

**我的问题是:**如何根据此索引搜索在cats中包含特定id的所有文档?单个匹配项即可。
**我尝试过的方法:**我尝试过许多不同的查询,包括嵌套在dogs上,以及嵌套在dogscats上。我尝试过直接通过dogs.cats.id访问属性,以及上述方法的所有组合。下面是NEST中的一个示例:

query &= mst.Nested(n => n
    .Path("dogs")
    .Query(q => q
        .Nested(n => n
            .Path("dogs.cats")
            .Query(q => q
                .Terms(t => t
                    .Field("dogs.cats.id")
                    .Terms(catIds.ToList())
                )
            )
        )
    )
);

我也试过用一个单一的NestedField设置为cats.id没有运气。
如果您能在这里提供任何帮助,我们将不胜感激。此时更改数据结构将是一项非常大的工作,如果可能的话,我们将尽量避免。谢谢!

xbp102n0

xbp102n01#

根据您提供的信息,我认为使用**NestedQuery**是理想的选择。

PUT bug_reports
{
  "mappings": {
    "properties": {
      "dogs": {
        "type": "nested",
        "properties": {
          "cats": {
            "type": "nested"
          }
        }
      }
    }
  }
}

POST bug_reports/_doc/1
{
   "dogs": [
    {
      "name": "wiener dog",
      "id": 1,
      "cats": [
        {
          "name":"red cat",
          "id": 4
        },
        {
          "name":"mean cat",
          "id": 5
        }
      ]
    }
  ]
}

POST bug_reports/_doc/2
{
   "dogs": [
    {
      "name": "none dog",
      "id": 2,
      "cats": [
        {
          "name":"mean cat",
          "id": 5
        }
      ]
    }
  ]
}

GET bug_reports/_search?filter_path=hits.hits
{
  "query": {
    "nested": {
      "path": "dogs",
      "query": {
        "bool": {
          "must": [
            {
              "nested": {
                "path": "dogs.cats",
                "query": {
                  "terms": {
                    "dogs.cats.id": [
                      4
                    ]
                  }
                }
              }
            },
            {
              "nested": {
                "path": "dogs.cats",
                "query": {
                  "terms": {
                    "dogs.cats.id": [
                      5
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

相关问题