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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch - 仅搜索与搜索响应中的所有顶级字段匹配的嵌套对象相关的知识,希望对你有一定的参考价值。

让我说我有以下文件:

{
    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

答案

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

{
  "_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"
              }
            }
          ]
        }
      }
    }
  }
}
另一答案

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

"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

以上是关于ElasticSearch - 仅搜索与搜索响应中的所有顶级字段匹配的嵌套对象的主要内容,如果未能解决你的问题,请参考以下文章

《Elasticsearch 源码解析与优化实战》第9章:Search流程

Elasticsearch使用自适应副本选择改进弹性搜索的响应延迟

Elasticsearch使用自适应副本选择改进弹性搜索的响应延迟

elasticsearch 轻量搜索

es的基本理论与简单操作

Elasticsearch 搜索