Получение уникального количества документов для агрегации массивов хитов, sum_other_doc_count - PullRequest
0 голосов
/ 02 марта 2020

У меня есть большое количество документов (миллионов), которые имеют массивы значений ключевых слов:

Сопоставление:

{
    "my_index": {
        "mappings": {
            "properties": {
                "id": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "keywords": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }
}

Примеры документов:

{
  "id": "abc",
  "keywords": ["cat", "dog", "person"]
}
{
  "id": "def",
  "keywords": ["tree", "person"]
}
{
  "id": "ghi",
  "keywords": ["person", "human"]
}
...

Давайте скажем, я получаю верхние 3 сегмента ключевых слов, а остальные отображаются в «другом» следующим образом:

/GET /my_index/_search
{
    "size": 0,
    "track_total_hits": true,
    "aggs": {
        "keyword_buckets": {
            "terms": {
                "field": "keywords.keyword",
                "size": 3
            }
        }
    }
}

Есть 2 232 121 документа, но я получаю следующие сегменты:

{
    "took": 256,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2232121,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    },
    "aggregations": {
        "keyword_buckets": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 6250132,
            "buckets": [
                {
                    "key": "person",
                    "doc_count": 326552
                },
                {
                    "key": "human",
                    "doc_count": 326529
                },
                {
                    "key": "photograph",
                    "doc_count": 222190
                }
            ]
        }
    }
}

Я получаю 6 250 132 документов в «другом» ведре. Я ожидаю, что сумма лучших 3 и «другого» будет 2,232,121. В SQL терминах это будет DISTINCT количество документов для всех сегментов.

Какой запрос мне нужно сделать, чтобы достичь этого?

1 Ответ

0 голосов
/ 02 марта 2020

Elasticsearch не дает вам точного количества документов. У c отсчеты всегда приблизительны. Это связано с тем, что в соответствии с разработанным запросомasticsearch выполняется поиск по верхним терминам каждого сегмента и их объединяет Вы можете прочитать больше об этом здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...