# Включить/исключить документы из группы terms aggs

**URL:** <https://discuss.elastic.co/t/terms-aggs/250417>\
**Category:** Вопросы на русском языке\
**Created:** [September 29, 2020, 9:22pm UTC](https://discuss.elastic.co/t/terms-aggs/250417 "2020-09-29T21:22:36Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![bio](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/bio/32/76409_2.png) [@bio](https://discuss.elastic.co/u/bio)\
**Post date:** [September 29, 2020, 9:22pm UTC](https://discuss.elastic.co/t/terms-aggs/250417/1 "2020-09-29T21:22:36Z")

</div>

Здравствуйте, подскажите пож-та, можно ли сделать terms аггрегацию с условием что один из сгруппированных документов должен иметь определённое значение поля, при этом остальные документы могут иметь другое значение, но они тоже должны быть в результате группировки.  
Например есть документы

> **Документы**
>
> ```
> {
> "id": 1,
> "status": 1,
> "data": {"reference": 1, "upc": 1 }
> }
> 
> {
> "id": 2,
> "status": 2,
> "data": {"reference": 1, "upc": 2 }
> }
> 
> {
> "id": 3,
> "status": 1,
> "data": {"reference": 1, "upc": 3 }
> }
> 
> ```

Нужно найти эти документы только если в группе объеденнёных документов, есть документ с **"status": 2** , если в группе нет документа с таким статусом, то вся группа должна отсутстовать в результатах.  
Сами документы группируются по полю **data.reference**  
Сейчас поиск работает по такому запросу и в нём не учитывается статус.

> **Запрос**
>
> ```
> {
> "size": 0,
> "aggs": {
> "products": {
> "composite": {
> "size": 200,
>         
> "sources": [
> {
> "by_merge_field": {
> "terms": {
> "script": {
> "source": """
> if(!doc['data.reference.keyword'].empty) {
> return doc['data.reference.keyword'].value
> }
>                     
> if(!doc['data.upc.keyword'].empty) {
> return doc['data.upc.keyword'].value
> }
>           
> return null
> """,
> "lang": "painless"
> }
> }
> }
> }
> ]
> },
> "aggs": {
> "docs": {
> "top_hits": {
> "_source": {
> "includes": ""
> }
> }
> }
> }
> }
> }
> }
> 
> ```

---

<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 29, 2020, 9:56pm UTC](https://discuss.elastic.co/t/terms-aggs/250417/2 "2020-09-29T21:56:17Z")

</div>

Если я вас правильно понял, то можно с агрегацией `filter` и `bucket_selector`:

```auto
DELETE test

POST test/_bulk
{"index":{}}
{"id":1,"status":1,"data":{"reference":1,"upc":1}}
{"index":{}}
{"id":2,"status":2,"data":{"reference":1,"upc":2}}
{"index":{}}
{"id":3,"status":1,"data":{"reference":1,"upc":3}}
{"index":{}}
{"id":4,"status":1,"data":{"reference":2,"upc":1}}
{"index":{}}
{"id":5,"status":1,"data":{"reference":2,"upc":4}}
{"index":{}}
{"id":6,"status":2,"data":{"reference":3,"upc":1}}
{"index":{}}
{"id":7,"status":2,"data":{"reference":3,"upc":4}}

GET test/_search
{
  "size": 0,
  "aggs": {
    "by_reference": {
      "terms": {
        "field": "data.reference",
        "size": 10
      },
      "aggs": {
        "with_status_2": {
          "filter": {
            "term": {
              "status": {
                "value": "2"
              }
            }
          }
        },
        "my_selector": {
          "bucket_selector": {
            "buckets_path": {
              "status_found": "with_status_2._count"
            },
            "script": "params.status_found > 0"
          }
        }
      }
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![bio](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/bio/32/76409_2.png) [@bio](https://discuss.elastic.co/u/bio)\
**Post date:** [September 30, 2020, 11:44am UTC](https://discuss.elastic.co/t/terms-aggs/250417/3 "2020-09-30T11:44:46Z")

</div>

Спасибо, работает!  
Можно ли `bucket_selector` подружить с `composite` ?  
Агрегацию `composite` использую только для пагинации

---

<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:22pm UTC](https://discuss.elastic.co/t/terms-aggs/250417/4 "2020-09-30T18:22:43Z")

</div>

Нет, но можно добавить `"order": { "_key": "asc" }` и завернуть все в `filter` agg с запросом `range`, чтобы только получить записи, в которых значения поля `data.reference` больше последнего значения, которое мы видели. То есть, если последнее значение `data.reference` было 33, то запрос будет такой:

```auto
GET test/_search
{
  "size": 0,
  "aggs": {
    "paging": {
      "filter": {
        "range": {
          "data.reference": {
            "gt": 33
          }
        }
      },
      "aggs": {
        "by_reference": {
          "terms": {
            "field": "data.reference",
            "size": 10,
            "order": {
              "_key": "asc"
            }
          },
          "aggs": {
            "with_status_2": {
              "filter": {
                "term": {
                  "status": {
                    "value": "2"
                  }
                }
              }
            },
            "my_selector": {
              "bucket_selector": {
                "buckets_path": {
                  "status_found": "with_status_2._count"
                },
                "script": "params.status_found > 0"
              }
            }
          }
        }
      }
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![bio](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/bio/32/76409_2.png) [@bio](https://discuss.elastic.co/u/bio)\
**Post date:** [October 23, 2020, 1:44pm UTC](https://discuss.elastic.co/t/terms-aggs/250417/5 "2020-10-23T13:44:42Z")

</div>

Спасибо! Буду пробовать

---

<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:** [November 20, 2020, 1:44pm UTC](https://discuss.elastic.co/t/terms-aggs/250417/6 "2020-11-20T13:44:44Z")

</div>

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