# Разные результаты "одинаковых" запросов

**URL:** <https://discuss.elastic.co/t/topic/40668>\
**Category:** Вопросы на русском языке\
**Created:** [February 1, 2016, 8:52pm UTC](https://discuss.elastic.co/t/topic/40668 "2016-02-01T20:52:06Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![rero](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/rero/32/7201_2.png) [@rero](https://discuss.elastic.co/u/rero)\
**Post date:** [February 1, 2016, 8:52pm UTC](https://discuss.elastic.co/t/topic/40668/1 "2016-02-01T20:52:07Z")

</div>

Два одинаковых запроса но во втором группировка по дате с шагом месяц, между датами 1ч 40 мин  
Первый:

```
[
        'index' => 'index',
        'type' => 'type',
        'size' => 0,
        'body' => [
            'query' => [
                'filtered' => [
                    'query' => ['match_all' => [], ],
                    'filter' => [
                        'bool' => [
                            'must' => [
                                ['range' => [ 'event_at' => [ 'gte' => 1446394000, 'lte' => 1446399900, 'format' => 'epoch_second',], ], ],
                                ['term' => [ 'project_id' => 2,], ],
                                ['term' => [ 'country_id' => '2',],],
                                ['term' => [ 'event_id' => 4,], ],
                            ],
                        ],
                    ],
                  ],
              ],
            'aggregations' => ['dau' => [ 'cardinality' => [ 'field' => 'user_id',], ], ],
          ],
      ]

```

Ответ:

```
  'hits' =>
  array (
    'total' => 623,
    'max_score' => 0,
    'hits' =>
    array (
    ),
  ),
  'aggregations' =>
  array (
    'dau' =>
    array (
      'value' => 99,
    ),
  ),

```

Второй запрос:

```
[
        'index' => 'index',
        'type' => 'type',
        'size' => 0,
        'body' =>
          [
            'query' => [
                'filtered' => [
                    'query' => ['match_all' => [], ],
                    'filter' => [
                        'bool' => [
                            'must' => [
                                  ['range' => [ 'event_at' => [ 'gte' => 1446394000, 'lte' => 1446399900, 'format' => 'epoch_second',], ], ],
                                  ['term' => [ 'project_id' => 2,], ],
                                  ['term' => [ 'country_id' => '2',], ],
                                  ['term' => [ 'event_id' => 4,], ],
                              ],
                          ],
                      ],
                  ],
              ],
            'aggregations' => [
                'date_range' => [
                    'date_histogram' => ['field' => 'event_at', 'interval' => 'month'],
                    'aggregations' => ['dau' => [ 'cardinality' => [ 'field' => 'user_id'] ] ]
                ]
            ]
          ]
      ]

```

Ответ:

```
'hits' =>
  array (
    'total' => 623,
    'max_score' => 0,
    'hits' =>
    array (
    ),
  ),
  'aggregations' =>
  array (
    'date_range' =>
    array (
      'buckets' =>
      array (
        0 =>
        array (
          'key_as_string' => '2015-11-01T00:00:00.000Z',
          'key' => 1446336000000,
          'doc_count' => 623,
          'dau' =>
          array (
            'value' => 98,
          ),
        ),
      ),
    ),
  ),

```

Разница в 1.  
На большем диапазоне разрыв будет больше, хотя диапазон попадает в месяц и кол-во документов одинаковое.  
С чем это может быть связано?

---

<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:** [February 2, 2016, 1:25am UTC](https://discuss.elastic.co/t/topic/40668/2 "2016-02-02T01:25:55Z")

</div>

cardinality aggregation вычисляет количество документов приближенно. Вполне возможно, что в зависимости от того, как оно рассчитывается, вы получаете разные значения.

---

<div class="post-metadata">

**Author:** ![rero](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/rero/32/7201_2.png) [@rero](https://discuss.elastic.co/u/rero)\
**Post date:** [February 2, 2016, 7:30am UTC](https://discuss.elastic.co/t/topic/40668/3 "2016-02-02T07:30:52Z")

</div>

А есть возможность повлиять на точность?  
Нашел [ответ](https://www.elastic.co/guide/en/elasticsearch/reference/2.x/search-aggregations-metrics-cardinality-aggregation.html#_precision_control) _'precision\_threshold' =\> 100_

Есть ли другой вариант точного расчета?

---

<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:** [February 2, 2016, 3:26pm UTC](https://discuss.elastic.co/t/topic/40668/4 "2016-02-02T15:26:02Z")

</div>

Если вам нужна абсолютная точность - то надо либо использовать агрегацию `filter` (но вам при это нужно знать все значения полей которые вас интересуют), либо использовать агрегацию `terms` со большим значением в `shard_size`. Этот параметр должен быть больше чем максимальное количество различных токенов в поле в одной шарде. То есть, если вы ищете по `user_id`, то `shard_size` должен быть равен ожидаемому количеству разных пользователей в одной шарде. Однако, все эти значения будут храниться в памяти и пересылаться между нодами во время запроса, так что данное решение плохо масштабируется.

---

<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:** [July 6, 2017, 1:49pm UTC](https://discuss.elastic.co/t/topic/40668/5 "2017-07-06T13:49:41Z")

</div>

Closed on July 6, 2017, 1:49pm UTC


