Агрегирование Sampler
Фильтровальное агрегирование, используемое для ограничения обработки любых вложенных агрегаций выборкой лучших документов по результатам ранжирования.
Примеры использования:
- Уточнение анализа, чтобы сфокусироваться на результатах с высоким рейтингом, а не на потенциально очень большом хвосте результатов низкого качества
- Сокращение затрат на выполнение агрегирования, которое может давать полезные результаты, используя только выборку, например,
significant_terms
Пример:
Запрос к данным StackOverflow для популярного термина javascript ИЛИ более редкого термина kibana будет соответствовать многим документам — большинство из которых не содержат слово Kibana. Чтобы сфокусировать агрегирование significant_terms на документах с лучшими результатами, которые, скорее всего, соответствуют наиболее интересным частям запроса, мы используем выборку.
resp = client.search(
index="stackoverflow",
size="0",
query={
"query_string": {
"query": "tags:kibana OR tags:javascript"
}
},
aggs={
"sample": {
"sampler": {
"shard_size": 200
},
"aggs": {
"keywords": {
"significant_terms": {
"field": "tags",
"exclude": [
"kibana",
"javascript"
]
}
}
}
}
},
)
print(resp) response = client.search(
index: 'stackoverflow',
size: 0,
body: {
query: {
query_string: {
query: 'tags:kibana OR tags:javascript'
}
},
aggregations: {
sample: {
sampler: {
shard_size: 200
},
aggregations: {
keywords: {
significant_terms: {
field: 'tags',
exclude: [
'kibana',
'javascript'
]
}
}
}
}
}
}
)
puts response const response = await client.search({
index: "stackoverflow",
size: 0,
query: {
query_string: {
query: "tags:kibana OR tags:javascript",
},
},
aggs: {
sample: {
sampler: {
shard_size: 200,
},
aggs: {
keywords: {
significant_terms: {
field: "tags",
exclude: ["kibana", "javascript"],
},
},
},
},
},
});
console.log(response); POST /stackoverflow/_search?size=0
{
"query": {
"query_string": {
"query": "tags:kibana OR tags:javascript"
}
},
"aggs": {
"sample": {
"sampler": {
"shard_size": 200
},
"aggs": {
"keywords": {
"significant_terms": {
"field": "tags",
"exclude": [ "kibana", "javascript" ]
}
}
}
}
}
} Ответ:
{
...
"aggregations": {
"sample": {
"doc_count": 200,
"keywords": {
"doc_count": 200,
"bg_count": 650,
"buckets": [
{
"key": "elasticsearch",
"doc_count": 150,
"score": 1.078125,
"bg_count": 200
},
{
"key": "logstash",
"doc_count": 50,
"score": 0.5625,
"bg_count": 50
}
]
}
}
}
} | Всего было отобрано 200 документов. Таким образом, стоимость выполнения вложенного агрегирования significant_terms была ограничена, а не безгранична. |
Без агрегирования sampler запрос учитывает весь «хвост» низкокачественных соответствий и, следовательно, определяет менее значимые термины, такие как jquery и angular, а не сосредотачивается на более информативных терминах, связанных с Kibana.
resp = client.search(
index="stackoverflow",
size="0",
query={
"query_string": {
"query": "tags:kibana OR tags:javascript"
}
},
aggs={
"low_quality_keywords": {
"significant_terms": {
"field": "tags",
"size": 3,
"exclude": [
"kibana",
"javascript"
]
}
}
},
)
print(resp) response = client.search(
index: 'stackoverflow',
size: 0,
body: {
query: {
query_string: {
query: 'tags:kibana OR tags:javascript'
}
},
aggregations: {
low_quality_keywords: {
significant_terms: {
field: 'tags',
size: 3,
exclude: [
'kibana',
'javascript'
]
}
}
}
}
)
puts response const response = await client.search({
index: "stackoverflow",
size: 0,
query: {
query_string: {
query: "tags:kibana OR tags:javascript",
},
},
aggs: {
low_quality_keywords: {
significant_terms: {
field: "tags",
size: 3,
exclude: ["kibana", "javascript"],
},
},
},
});
console.log(response); POST /stackoverflow/_search?size=0
{
"query": {
"query_string": {
"query": "tags:kibana OR tags:javascript"
}
},
"aggs": {
"low_quality_keywords": {
"significant_terms": {
"field": "tags",
"size": 3,
"exclude": [ "kibana", "javascript" ]
}
}
}
} Ответ:
{
...
"aggregations": {
"low_quality_keywords": {
"doc_count": 600,
"bg_count": 650,
"buckets": [
{
"key": "angular",
"doc_count": 200,
"score": 0.02777,
"bg_count": 200
},
{
"key": "jquery",
"doc_count": 200,
"score": 0.02777,
"bg_count": 200
},
{
"key": "logstash",
"doc_count": 50,
"score": 0.0069,
"bg_count": 50
}
]
}
}
} shard_size
Параметр shard_size ограничивает количество лучших документов, собранных в выборке, обрабатываемой на каждом фрагменте. Значение по умолчанию равно 100.
Ограничения
Не может быть вложен в breadth_first агрегирования
Будучи фильтром, основанным на качестве, агрегирование sampler нуждается в доступе к оценке релевантности, вычисляемой для каждого документа. Поэтому оно не может быть вложено в terms агрегирование, у которого режим collect_mode изменён со значения по умолчанию depth_first на breadth_first, поскольку это отбрасывает оценки. В этой ситуации будет выброшено сообщение об ошибке.
© 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/search-aggregations-bucket-sampler-aggregation.html