ElasticSearch - 仅搜索与搜索响应中的所有顶级字段匹配的嵌套对象

问题描述 投票:12回答:2

让我说我有以下文件:

{
    id: 1,
    name: "xyz",
    users: [
        {
            name: 'abc',
            surname: 'def'
        },
        {
            name: 'xyz',
            surname: 'wef'
        },
        {
            name: 'defg',
            surname: 'pqr'
        }
    ]
}

我想在搜索响应中仅获取与所有顶级字段匹配的嵌套对象。我的意思是如果我搜索/过滤名为'abc'的用户,我想要低于响应

{
    id: 1,
    name: "xyz",
    users: [
        {
            name: 'abc',
            surname: 'def'
        }
    ]
}

我怎样才能做到这一点?

参考:select matching objects from array in elasticsearch

elasticsearch
2个回答
13
投票

如果您可以使用除嵌套字段之外的所有根字段,然后只在嵌套字段中匹配内部匹配,那么我们可以通过指定稍微更复杂的源过滤参数来重复使用之前的答案:

{
  "_source": {
    "includes": [ "*" ],
    "excludes": [ "users" ]
  },
  "query": {
    "nested": {
      "path": "users",
      "inner_hits": {        <---- this is where the magic happens
        "_source": [
          "name", "surname"
        ]
      },
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "users.name": "abc"
              }
            }
          ]
        }
      }
    }
  }
}

0
投票

也许迟到了,我使用嵌套排序来限制嵌套关系中的元素,这里是一个例子:

"sort": {
    "ouverture.periodesOuvertures.dateDebut": {
      "order": "asc",
      "mode": "min",
      "nested_filter": {
        "range": {
          "ouverture.periodesOuvertures.dateFin": {
            "gte": "2017-08-29",
            "format": "yyyy-MM-dd"
          }
        }
      },
      "nested_path": "ouverture.periodesOuvertures"
    }
  },

从5.5 ES(我认为)你可以使用嵌套查询过滤器。这里是我使用的嵌套查询过滤器的示例:

{
            "nested": {
              "path": "ouverture.periodesOuvertures",
              "query": {
                "bool": {
                  "must": [
                    {
                      "range": {
                        "ouverture.periodesOuvertures.dateFin": {
                          "gte": "2017-08-29",
                          "format": "yyyy-MM-dd"
                        }
                      }
                    },
                    {
                      "range": {
                        "ouverture.periodesOuvertures.dateFin": {
                          "lte": "2017-09-30",
                          "format": "yyyy-MM-dd"
                        }
                      }
                    }
                  ],
                  "filter": [
                    {
                      "range": {
                        "ouverture.periodesOuvertures.dateFin": {
                          "gte": "2017-08-29",
                          "format": "yyyy-MM-dd"
                        }
                      }
                    },
                    {
                      "range": {
                        "ouverture.periodesOuvertures.dateFin": {
                          "lte": "2017-09-30",
                          "format": "yyyy-MM-dd"
                        }
                      }
                    }
                  ]
                }
              }
            }
          }

希望这可以帮助;)

另外,如果您的ES不在最后一个版本(5.5)中,inner_hits可能会减慢您的查询Including inner hits drastically slows down query results

© www.soinside.com 2019 - 2024. All rights reserved.