# Можно ли отфильтровать совпадению со всеми вложенными сущностями?

**URL:** <https://discuss.elastic.co/t/topic/250549>\
**Category:** Вопросы на русском языке\
**Created:** [September 30, 2020, 5:04pm UTC](https://discuss.elastic.co/t/topic/250549 "2020-09-30T17:04:41Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![jen\_sluch](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jen_sluch/32/71654_2.png) [@jen\_sluch](https://discuss.elastic.co/u/jen_sluch)\
**Post date:** [September 30, 2020, 5:04pm UTC](https://discuss.elastic.co/t/topic/250549/1 "2020-09-30T17:04:41Z")

</div>

Добрый день.  
Хочу фильтрануть выборку так что бы ВСЕ nested объекты подпадали под запрос.  
Пример:

```auto
    [
          {
            "_index" : "test-profiles",
            "_type" : "_doc",
            "_id" : "n4fP33QBtwtcEcs-Y29P",
            "_score" : 1.3254224,
            "_source" : {
              "name" : "3 profile dody",
              "grop_criteria" : [
                {
                  "a" : 5,
                  "b" : false,
                  "c" : "asd"
                }
              ]
            }
          },
          {
            "_index" : "test-profiles",
            "_type" : "_doc",
            "_id" : "oYfR33QBtwtcEcs-A2-E",
            "_score" : 1.3254224,
            "_source" : {
              "name" : "3 profile dody",
              "grop_criteria" : [
                {
                  "a" : 5,
                  "b" : false,
                  "c" : "asd"
                },
                {
                  "a" : 1,
                  "b" : true,
                  "c" : "dsa"
                }
              ]
            }
          }
        ]

```

Хочу a\>2 и c=asd  
"n4fP33QBtwtcEcs-Y29P" попадет в выборку  
"oYfR33QBtwtcEcs-A2-E" не должен

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 30, 2020, 6:24pm UTC](https://discuss.elastic.co/t/topic/250549/2 "2020-09-30T18:24:59Z")

</div>

А если grop\_criteria - пустое?

---

<div class="post-metadata">

**Author:** ![jen\_sluch](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jen_sluch/32/71654_2.png) [@jen\_sluch](https://discuss.elastic.co/u/jen_sluch)\
**Post date:** [September 30, 2020, 6:41pm UTC](https://discuss.elastic.co/t/topic/250549/3 "2020-09-30T18:41:21Z")

</div>

тоже попадает в выборку)

---

<div class="post-metadata">

**Author:** ![jen\_sluch](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jen_sluch/32/71654_2.png) [@jen\_sluch](https://discuss.elastic.co/u/jen_sluch)\
**Post date:** [September 30, 2020, 6:44pm UTC](https://discuss.elastic.co/t/topic/250549/4 "2020-09-30T18:44:18Z")

</div>

я уже смотрю в сторону скриптов и сравнения хитов, если конечно это возможно

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 30, 2020, 7:25pm UTC](https://discuss.elastic.co/t/topic/250549/5 "2020-09-30T19:25:11Z")

</div>

Есть такой трюк. Вместо того, чтобы сразу искать нужные документы, мы начнем, с нахождения всех ненужных документов - то есть документов, в которых есть хотябы один вложенный объект, в котором `a <= 2` или `c != asd`. А потом мы этот список инвертируем - то есть оставим только документы, которые не вошли в этот список:

```auto
DELETE test

PUT test
{
  "mappings": {
    "properties": {
      "grop_criteria": {
        "type": "nested",
        "properties": {
          "c": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

PUT test/_bulk
{"index":{"_id": "n4fP33QBtwtcEcs-Y29P"}}
{"name":"3 profile dody","grop_criteria":[{"a":5,"b":false,"c":"asd"}]}
{"index":{"_id": "oYfR33QBtwtcEcs-A2-E"}}
{"name":"3 profile dody","grop_criteria":[{"a":5,"b":false,"c":"asd"},{"a":1,"b":true,"c":"dsa"}]}    
{"index":{"_id": "empty_criteria"}}
{"name":"3 profile dody"}    
{"index":{"_id": "totatly_off"}}
{"name":"3 profile dody","grop_criteria":[{"a":-5,"b":false,"c":"xyz"}]}    
{"index":{"_id": "all_good"}}
{"name":"3 profile dody","grop_criteria":[{"a":10,"b":false,"c":"asd"}, {"a":12,"b":false,"c":"asd"}]}    

GET test/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "grop_criteria",
            "query": {
              "bool": {
                "should": [
                  {
                    "range": {
                      "grop_criteria.a": {
                        "lte": 2
                      }
                    }
                  },
                  {
                    "bool": {
                      "must_not": [
                        {
                          "term": {
                            "grop_criteria.c": {
                              "value": "asd"
                            }
                          }
                        }
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![jen\_sluch](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jen_sluch/32/71654_2.png) [@jen\_sluch](https://discuss.elastic.co/u/jen_sluch)\
**Post date:** [September 30, 2020, 7:38pm UTC](https://discuss.elastic.co/t/topic/250549/6 "2020-09-30T19:38:55Z")

</div>

Спасибо!  
Очень похоже на рабочий вариант.  
В плане читабельности, запросы в инверсии будут прихрамывать, конечно.  
Очень надеялся что в эластике есть какой-то встроенный механизм для магии такого рода.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [September 30, 2020, 7:42pm UTC](https://discuss.elastic.co/t/topic/250549/7 "2020-09-30T19:42:12Z")

</div>

Упрощенный вариант без инверсии запросов:

```auto
GET test/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "grop_criteria",
            "query": {
              "bool": {
                "must_not": [
                  {
                    "range": {
                      "grop_criteria.a": {
                        "gt": 2
                      }
                    }
                  },
                  {
                    "term": {
                      "grop_criteria.c": {
                        "value": "asd"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [October 28, 2020, 7:42pm UTC](https://discuss.elastic.co/t/topic/250549/8 "2020-10-28T19:42:19Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
