Поле _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
} | Поле |
Если мы запустим следующую агрегацию по условиям на 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