Elasticsearch применяет фильтр запросов к вложенному списку, отфильтровывая несопоставленные вложенные объекты

У меня есть документ, который содержит вложенный список объектов. Я хотел бы создать запрос для возврата документов, которые содержат определенный вложенный элемент, но также ограничить приведенный список вложенных элементов теми, которые удовлетворяют условиям.

Например:

Я хочу получить все документы, которые содержат вложенный элемент "user.first": "Алиса", но также ограничить результаты, возвращаемые в "пользователи", только объектами, которые содержат в первую очередь: Алиса

PUT /posts?pretty

PUT posts
{
  "mappings": {
    "doc": {
      "properties": {
        "user": {
          "type": "nested" 
        }
      }
    }
  }
}

PUT posts/doc/1
{
  "group" : "fans",
  "user" : [
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

PUT posts/doc/2
{
  "group" : "fans",
  "user" : [
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "Black"
    },
    {
      "first" : "Alice",
      "last" :  "Red"
    }
  ]
}

Затем я могу использовать inner_hits, чтобы получить совпадающего пользователя, но я хотел бы получить этот список внутри _source.user вместо этого внутри inner_hits (не возвращайте _source.user, который не содержит Алису):

GET posts/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "Alice" }} 
          ]
        }
      },
       "inner_hits": { }

    }
  }
}

возвращает это:

#hit 1:
{.....
},
#hit 2:
 {
        "_index": "posts",
        "_type": "doc",
        "_id": "2",
        "_source": {
          "group": "fans",
          "user": [
                {
                  "first" : "John",
                  "last" :  "Smith"
                },
                {
                  "first" : "Alice",
                  "last" :  "Black"
                },
                {
                  "first" : "Alice",
                  "last" :  "Red"
                }
          ]
        },
        "inner_hits": {
          "user": {
            "hits": {
              "total": 2,
              "hits": [
                {
                  "_nested": {
                    "field": "user",
                    "offset": 2
                  },
                  "_source": {
                    "first": "Alice",
                    "last": "Black"
                  }
                },
                {
                  "_nested": {
                    "field": "user",
                    "offset": 1
                  },
                  "_source": {
                    "first": "Alice",
                    "last": "Red"
                  }
                }
              ]
            }
          }
        }

0 ответов

Другие вопросы по тегам