Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Mapping ›Поля метаданных

Поле _doc_count

Агрегации по корзинам всегда возвращают поле с именем doc_count, показывающее количество документов, которые были агрегированы и распределены по каждой корзине. Вычисление значения doc_count очень просто. doc_count увеличивается на 1 для каждого документа, собранного в каждой корзине.

Хотя этот простой подход эффективен при вычислении агрегаций по отдельным документам, он неточно отражает документы, которые хранят предварительно агрегированные данные (например, поля histogram или aggregate_metric_double), так как одно сводное поле может представлять несколько документов.

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

Когда к документу добавляется поле _doc_count, все агрегации по корзинам учитывают его значение и увеличивают счетчик корзины doc_count на значение поля. Если документ не содержит поля _doc_count, то значение _doc_count = 1 подразумевается по умолчанию.

  • Поле _doc_count может хранить только одно положительное целое число на документ. Вложенные массивы запрещены.
  • Если документ не содержит полей _doc_count, агрегаторы будут увеличивать значение на 1, что является по умолчанию.

Пример

Следующий запрос API создания индекса создает новый индекс со следующими отображениями полей:

  • my_histogram, поле histogram, используемое для хранения данных процентилей
  • my_text, поле keyword, используемое для хранения заголовка для гистограммы
resp = client.indices.create(
    index="my_index",
    mappings={
        "properties": {
            "my_histogram": {
                "type": "histogram"
            },
            "my_text": {
                "type": "keyword"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my_index',
  body: {
    mappings: {
      properties: {
        my_histogram: {
          type: 'histogram'
        },
        my_text: {
          type: 'keyword'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my_index",
  mappings: {
    properties: {
      my_histogram: {
        type: "histogram",
      },
      my_text: {
        type: "keyword",
      },
    },
  },
});
console.log(response);
PUT my_index
{
  "mappings" : {
    "properties" : {
      "my_histogram" : {
        "type" : "histogram"
      },
      "my_text" : {
        "type" : "keyword"
      }
    }
  }
}

Следующие запросы API индексирования хранят предварительно агрегированные данные для двух гистограмм: histogram_1 и histogram_2.

resp = client.index(
    index="my_index",
    id="1",
    document={
        "my_text": "histogram_1",
        "my_histogram": {
            "values": [
                0.1,
                0.2,
                0.3,
                0.4,
                0.5
            ],
            "counts": [
                3,
                7,
                23,
                12,
                6
            ]
        },
        "_doc_count": 45
    },
)
print(resp)

resp1 = client.index(
    index="my_index",
    id="2",
    document={
        "my_text": "histogram_2",
        "my_histogram": {
            "values": [
                0.1,
                0.25,
                0.35,
                0.4,
                0.45,
                0.5
            ],
            "counts": [
                8,
                17,
                8,
                7,
                6,
                2
            ]
        },
        "_doc_count": 62
    },
)
print(resp1)
response = client.index(
  index: 'my_index',
  id: 1,
  body: {
    my_text: 'histogram_1',
    my_histogram: {
      values: [
        0.1,
        0.2,
        0.3,
        0.4,
        0.5
      ],
      counts: [
        3,
        7,
        23,
        12,
        6
      ]
    },
    _doc_count: 45
  }
)
puts response

response = client.index(
  index: 'my_index',
  id: 2,
  body: {
    my_text: 'histogram_2',
    my_histogram: {
      values: [
        0.1,
        0.25,
        0.35,
        0.4,
        0.45,
        0.5
      ],
      counts: [
        8,
        17,
        8,
        7,
        6,
        2
      ]
    },
    _doc_count: 62
  }
)
puts response
const response = await client.index({
  index: "my_index",
  id: 1,
  document: {
    my_text: "histogram_1",
    my_histogram: {
      values: [0.1, 0.2, 0.3, 0.4, 0.5],
      counts: [3, 7, 23, 12, 6],
    },
    _doc_count: 45,
  },
});
console.log(response);

const response1 = await client.index({
  index: "my_index",
  id: 2,
  document: {
    my_text: "histogram_2",
    my_histogram: {
      values: [0.1, 0.25, 0.35, 0.4, 0.45, 0.5],
      counts: [8, 17, 8, 7, 6, 2],
    },
    _doc_count: 62,
  },
});
console.log(response1);
PUT my_index/_doc/1
{
  "my_text" : "histogram_1",
  "my_histogram" : {
      "values" : [0.1, 0.2, 0.3, 0.4, 0.5],
      "counts" : [3, 7, 23, 12, 6]
   },
  "_doc_count": 45 
}

PUT my_index/_doc/2
{
  "my_text" : "histogram_2",
  "my_histogram" : {
      "values" : [0.1, 0.25, 0.35, 0.4, 0.45, 0.5],
      "counts" : [8, 17, 8, 7, 6, 2]
   },
  "_doc_count": 62 
}

Поле _doc_count должно быть положительным целым числом, хранящим количество документов, агрегированных для создания каждой гистограммы.

Если мы запустим следующую агрегацию по условиям на my_index:

resp = client.search(
    aggs={
        "histogram_titles": {
            "terms": {
                "field": "my_text"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    aggregations: {
      histogram_titles: {
        terms: {
          field: 'my_text'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  aggs: {
    histogram_titles: {
      terms: {
        field: "my_text",
      },
    },
  },
});
console.log(response);
GET /_search
{
    "aggs" : {
        "histogram_titles" : {
            "terms" : { "field" : "my_text" }
        }
    }
}

Мы получим следующий ответ:

{
    ...
    "aggregations" : {
        "histogram_titles" : {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets" : [
                {
                    "key" : "histogram_2",
                    "doc_count" : 62
                },
                {
                    "key" : "histogram_1",
                    "doc_count" : 45
                }
            ]
        }
    }
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/mapping-doc-count-field.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API