Агрегация часто встречающихся наборов элементов
Агрегация по корзинам, которая находит часто встречающиеся наборы элементов. Это форма поиска ассоциативных правил, которая идентифицирует элементы, часто встречающиеся вместе. Примерами часто встречающихся наборов элементов являются товары, которые часто покупают вместе, или события регистрации, которые часто возникают вместе. Поиск часто встречающихся наборов элементов помогает обнаружить взаимосвязи между различными точками данных (элементами).
Агрегация сообщает о замкнутых наборах элементов. Часто встречающийся набор элементов называется замкнутым, если не существует надмножества с тем же коэффициентом документов (также известным как его значение поддержки). Например, у нас есть два следующих кандидата для часто встречающегося набора элементов, имеющие одинаковое значение поддержки: 1. apple, orange, banana 2. apple, orange, banana, tomato. Возвращается только второй набор элементов (apple, orange, banana, tomato), а первый набор — который является подмножеством второго — пропускается. Оба набора элементов могут быть возвращены, если их значения поддержки отличаются.
Время выполнения агрегации зависит от данных и заданных параметров. Для завершения агрегации может потребоваться значительное время. По этой причине рекомендуется использовать асинхронный поиск для выполнения запросов асинхронно.
Синтаксис
Агрегация frequent_item_sets выглядит следующим образом:
"frequent_item_sets": {
"minimum_set_size": 3,
"fields": [
{"field": "my_field_1"},
{"field": "my_field_2"}
]
} Таблица 51. frequent_item_sets Параметры
Имя параметра | Описание | Обязательно | Значение по умолчанию |
| (массив) Поля для анализа. | Обязательно | |
| (целое число) Минимальный размер одного набора элементов. | Необязательно |
|
| (целое число) Минимальная поддержка одного набора элементов. | Необязательно |
|
| (целое число) Количество верхних наборов элементов для возврата. | Необязательно |
|
| (объект) Запрос, фильтрующий документы из анализа. | Необязательно |
|
Поля
Поддерживаемые типы полей для анализируемых полей: ключевое слово, числовое, ip, дата и массивы этих типов. Вы также можете добавить поля выполнения к анализируемым полям.
Если совокупная мощность анализируемых полей высока, агрегация может потребовать значительных системных ресурсов.
Вы можете отфильтровать значения для каждого поля, используя параметры include и exclude. Параметры могут быть строками регулярных выражений или массивами строк точных терминов. Отфильтрованные значения удаляются из анализа и, следовательно, уменьшают время выполнения. Если оба include и exclude определены, exclude имеет приоритет; это означает, что include оценивается в первую очередь, а затем exclude.
Минимальный размер набора
Минимальный размер набора — это минимальное количество элементов, которое должен содержать набор. Значение 1 возвращает частоту отдельных элементов. Возвращаются только наборы элементов, содержащие не менее количества minimum_set_size элементов. Например, набор элементов orange, banana, apple возвращается только в том случае, если минимальный размер набора равен 3 или меньше.
Минимальная поддержка
Минимальное значение поддержки — это отношение документов, в которых должен существовать набор элементов, чтобы считаться «частым». В частности, это нормализованное значение от 0 до 1. Оно рассчитывается путем деления количества документов, содержащих набор элементов, на общее количество документов.
Например, если данный набор элементов содержится в пяти документах, а общее количество документов равно 20, то поддержка набора элементов составляет 5/20 = 0,25. Следовательно, этот набор возвращается только в том случае, если минимальная поддержка равна 0,25 или меньше. Поскольку более высокая минимальная поддержка обрезает больше элементов, вычисление менее ресурсоемкое. Параметр minimum_support влияет на требуемую память и время выполнения агрегации.
Размер
Этот параметр определяет максимальное количество наборов элементов для возврата. Результат содержит верхние k наборов элементов; наборы элементов с наибольшими значениями поддержки.
Фильтр
Запрос для фильтрации документов, которые будут использоваться в рамках анализа. Документы, которые не соответствуют фильтру, игнорируются при формировании наборов элементов, однако все еще учитываются при расчете поддержки набора элементов.
Используйте фильтр, если хотите сузить анализ набора элементов до полей, представляющих интерес. Используйте запрос верхнего уровня для фильтрации набора данных.
Примеры
В следующих примерах мы используем набор данных e-commerce Kibana.
Агрегация с двумя анализируемыми полями и параметром exclude
В первом примере цель заключается в том, чтобы выяснить на основе данных о транзакциях (1.) из каких категорий продуктов клиенты часто покупают продукты вместе и (2.) из каких городов они совершают эти покупки. Мы хотим исключить результаты, где отсутствует информация о местоположении (где имя города — other). Наконец, нас интересуют наборы с тремя или более элементами, и мы хотим увидеть три первых часто встречающихся набора элементов с наибольшей поддержкой.
Обратите внимание, что в этом первом примере мы используем конечную точку асинхронного поиска асинхронного поиска.
resp = client.async_search.submit(
index="kibana_sample_data_ecommerce",
size=0,
aggs={
"my_agg": {
"frequent_item_sets": {
"minimum_set_size": 3,
"fields": [
{
"field": "category.keyword"
},
{
"field": "geoip.city_name",
"exclude": "other"
}
],
"size": 3
}
}
},
)
print(resp) const response = await client.asyncSearch.submit({
index: "kibana_sample_data_ecommerce",
size: 0,
aggs: {
my_agg: {
frequent_item_sets: {
minimum_set_size: 3,
fields: [
{
field: "category.keyword",
},
{
field: "geoip.city_name",
exclude: "other",
},
],
size: 3,
},
},
},
});
console.log(response); POST /kibana_sample_data_ecommerce/_async_search
{
"size":0,
"aggs":{
"my_agg":{
"frequent_item_sets":{
"minimum_set_size":3,
"fields":[
{
"field":"category.keyword"
},
{
"field":"geoip.city_name",
"exclude":"other"
}
],
"size":3
}
}
}
} Ответ на вызов API выше содержит идентификатор (id) запроса асинхронного поиска. Вы можете использовать идентификатор для получения результатов поиска:
resp = client.async_search.get(
id="<id>",
)
print(resp) const response = await client.asyncSearch.get({
id: "<id>",
});
console.log(response); GET /_async_search/<id>
API возвращает ответ, похожий на следующий:
(...)
"aggregations" : {
"my_agg" : {
"buckets" : [
{
"key" : {
"category.keyword" : [
"Women's Clothing",
"Women's Shoes"
],
"geoip.city_name" : [
"New York"
]
},
"doc_count" : 217,
"support" : 0.04641711229946524
},
{
"key" : {
"category.keyword" : [
"Women's Clothing",
"Women's Accessories"
],
"geoip.city_name" : [
"New York"
]
},
"doc_count" : 135,
"support" : 0.028877005347593583
},
{
"key" : {
"category.keyword" : [
"Men's Clothing",
"Men's Shoes"
],
"geoip.city_name" : [
"Cairo"
]
},
"doc_count" : 123,
"support" : 0.026310160427807486
}
],
(...)
}
} | Массив возвращаемых наборов элементов. | |
| Объект | |
| Количество документов, содержащих набор элементов. | |
| Значение поддержки набора элементов. Оно рассчитывается путем деления количества документов, содержащих набор элементов, на общее количество документов. |
Из ответа видно, что категории, из которых клиенты чаще всего покупают товары вместе, это Women's Clothing и Women's Shoes, и клиенты из Нью-Йорка склонны часто покупать товары из этих категорий вместе. Другими словами, клиенты, которые покупают продукты, помеченные Women's Clothing, с большей вероятностью покупают также продукты из категории Women's Shoes, и клиенты из Нью-Йорка с большей вероятностью покупают продукты из этих категорий вместе. Набор элементов со второй по величине поддержкой — это Women's Clothing и Women's Accessories, в основном клиенты из Нью-Йорка. Наконец, набор элементов с третьей по величине поддержкой — это Men's Clothing и Men's Shoes, в основном клиенты из Каира.
Агрегация с двумя анализируемыми полями и фильтром
Мы берем первый пример, но хотим сузить наборы элементов до мест в Европе. Для этого мы добавляем фильтр, и на этот раз мы не используем параметр exclude:
resp = client.async_search.submit(
index="kibana_sample_data_ecommerce",
size=0,
aggs={
"my_agg": {
"frequent_item_sets": {
"minimum_set_size": 3,
"fields": [
{
"field": "category.keyword"
},
{
"field": "geoip.city_name"
}
],
"size": 3,
"filter": {
"term": {
"geoip.continent_name": "Europe"
}
}
}
}
},
)
print(resp) const response = await client.asyncSearch.submit({
index: "kibana_sample_data_ecommerce",
size: 0,
aggs: {
my_agg: {
frequent_item_sets: {
minimum_set_size: 3,
fields: [
{
field: "category.keyword",
},
{
field: "geoip.city_name",
},
],
size: 3,
filter: {
term: {
"geoip.continent_name": "Europe",
},
},
},
},
},
});
console.log(response); POST /kibana_sample_data_ecommerce/_async_search
{
"size": 0,
"aggs": {
"my_agg": {
"frequent_item_sets": {
"minimum_set_size": 3,
"fields": [
{ "field": "category.keyword" },
{ "field": "geoip.city_name" }
],
"size": 3,
"filter": {
"term": {
"geoip.continent_name": "Europe"
}
}
}
}
}
} Результат будет показывать только наборы элементов, созданные из документов, соответствующих фильтру, а именно покупок в Европе. Используя filter, рассчитанная support все еще учитывает все покупки. Это отличается от указания запроса на верхнем уровне, в котором случае support рассчитывается только для покупок в Европе.
Анализ числовых значений с использованием поля выполнения
Агрегация frequent items позволяет вам группировать числовые значения с помощью полей выполнения. Следующий пример демонстрирует, как использовать скрипт для добавления поля выполнения в ваши документы под названием price_range, которое рассчитывается из налогооблагаемой общей стоимости отдельных транзакций. Затем поле выполнения может быть использовано в агрегации frequent items как поле для анализа.
resp = client.search(
index="kibana_sample_data_ecommerce",
runtime_mappings={
"price_range": {
"type": "keyword",
"script": {
"source": "\n def bucket_start = (long) Math.floor(doc['taxful_total_price'].value / 50) * 50;\n def bucket_end = bucket_start + 50;\n emit(bucket_start.toString() + \"-\" + bucket_end.toString());\n "
}
}
},
size=0,
aggs={
"my_agg": {
"frequent_item_sets": {
"minimum_set_size": 4,
"fields": [
{
"field": "category.keyword"
},
{
"field": "price_range"
},
{
"field": "geoip.city_name"
}
],
"size": 3
}
}
},
)
print(resp) const response = await client.search({
index: "kibana_sample_data_ecommerce",
runtime_mappings: {
price_range: {
type: "keyword",
script: {
source:
"\n def bucket_start = (long) Math.floor(doc['taxful_total_price'].value / 50) * 50;\n def bucket_end = bucket_start + 50;\n emit(bucket_start.toString() + \"-\" + bucket_end.toString());\n ",
},
},
},
size: 0,
aggs: {
my_agg: {
frequent_item_sets: {
minimum_set_size: 4,
fields: [
{
field: "category.keyword",
},
{
field: "price_range",
},
{
field: "geoip.city_name",
},
],
size: 3,
},
},
},
});
console.log(response); GET kibana_sample_data_ecommerce/_search
{
"runtime_mappings": {
"price_range": {
"type": "keyword",
"script": {
"source": """
def bucket_start = (long) Math.floor(doc['taxful_total_price'].value / 50) * 50;
def bucket_end = bucket_start + 50;
emit(bucket_start.toString() + "-" + bucket_end.toString());
"""
}
}
},
"size": 0,
"aggs": {
"my_agg": {
"frequent_item_sets": {
"minimum_set_size": 4,
"fields": [
{
"field": "category.keyword"
},
{
"field": "price_range"
},
{
"field": "geoip.city_name"
}
],
"size": 3
}
}
}
} API возвращает ответ, похожий на следующий:
(...)
"aggregations" : {
"my_agg" : {
"buckets" : [
{
"key" : {
"category.keyword" : [
"Women's Clothing",
"Women's Shoes"
],
"price_range" : [
"50-100"
],
"geoip.city_name" : [
"New York"
]
},
"doc_count" : 100,
"support" : 0.0213903743315508
},
{
"key" : {
"category.keyword" : [
"Women's Clothing",
"Women's Shoes"
],
"price_range" : [
"50-100"
],
"geoip.city_name" : [
"Dubai"
]
},
"doc_count" : 59,
"support" : 0.012620320855614974
},
{
"key" : {
"category.keyword" : [
"Men's Clothing",
"Men's Shoes"
],
"price_range" : [
"50-100"
],
"geoip.city_name" : [
"Marrakesh"
]
},
"doc_count" : 53,
"support" : 0.011336898395721925
}
],
(...)
}
} Из ответа видно, какие категории товаров клиенты покупают чаще всего вместе, где находятся клиенты, которые склонны покупать товары из этих категорий, и самые частые ценовые диапазоны этих покупок.
© 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-frequent-item-sets-aggregation.html