elasticsearchвcollapse
функция позволяет пользователям искатьрезультатгруппа,В некоторых случаях это можно рассматривать как один из видов операции «Удалить дубликаты». Его основное предназначение – поиск больших объемов документов.,Отображать только один репрезентативный документ для каждой группы.,Вместо показа всех соответствующих документов.
collapse
Функция, основанная наодин Поиск пар значений одного или нескольких полейрезультатгруппа。Когда вы укажетеcollapse
После параметров,Elasticsearch автоматически группирует совпадающие документы.,При этом для каждой группы будет возвращен только один представительский документ. Этот репрезентативный документ обычно является одиннадцатым документом в группе.,Но его также можно настроить с помощью других параметров.
Вот какElasticsearchИспользуется в запросахcollapse
Базовый пример:
{
"query": {
"match": {
"field": "value"
}
},
"collapse": {
"field": "group_field"
}
}
В этом примере:
query
Частично определяет основные условия поиска。В этом примере,наши поля поискаfield
Значениеvalue
Документация。collapse
Частично определяет поля, используемые для группировки,Прямо сейчасgroup_field
。всесуществоватьэтотиндивидуальный Поля с одинаковым значением Документациябудут сгруппированысуществоватьодинрост,И возвращается только один представительский документ.Вы также можете добавитьinner_hits
Параметры для настройки возвращаемого документа представителя группы。Например,Если вы хотите вернуть документ с наивысшим рейтингом в каждой группе,Вы можете сделать это:
{
"query": {
"match": {
"field": "value"
}
},
"collapse": {
"field": "group_field",
"inner_hits": {
"name": "most_relevant",
"size": 1,
"sort": [
{
"_score": {
"order": "desc"
}
}
]
}
}
}
inner_hits
раздел определяет, как выбираются репрезентативные документы для каждой группировки。здесь,мы назвалиinner_hits
изрезультатдляmost_relevant
。size: 1
Указывает, что каждая группа возвращает толькоодиндокументы。sort
раздел определяет, как группировать Документацияруководитьсортировать。существоватьздесь,Согласно документации мыизсчет(_score
)Сортировать по убываниюсортировать,Таким образом, репрезентативным документом для каждой группы будет документ с наивысшим рейтингом в этой группе.scroll
、rescore
иsearch_after
Используется совместно с: потому чтоcollapse
нужнорезультатгруппаисортироватьопределить каждыйиндивидуальный Группаизлучший соответствующий документ,Этот процесс может быть связан сscroll
、rescore
иsearch_after
изнекоторый Функцияконфликт。collapse
обычно лучше, чем полностьюиз分Группаиполимеризация Работайте более эффективно,Потому что он возвращает только лучший документ для каждой группы.,Однако «Накладные» все равно могут возникать при обработке больших объемов данных. расходы на производительность。collapse
место параметраиспользоватьиз Поле должно бытьkeyword
илиnumber
тип,Поскольку эти типы значений полей являются точными,适используется для分Группаисортировать。использоватьtext
тип Поля могут вызывать неточностиизрезультат。существоватьиспользоватьcollapse
час,Обязательно учтите эти ограничения и лучший способ сделать это.,Чтобы обеспечить точность запроса и производительность. Правильно планируя и оптимизируя запросы,может быть использован полностьюcollapse
из分Группа Функция,Избегая при этом потенциальных узких мест производительности.
Используйте вместе с Агрегация. полей (условия)иагрегирование top_hits может добиться Удалить дубликаты Функция。
Объединив эти две агрегации, мы можем сначала выполнить группировку по определенному полю (выполнив предварительную «Удалить эффект «дубликации», то есть каждая группировка представляет собой уникальное значение поля), а затем использовать агрегирование в каждой группировке. top_hits возвращает репрезентативные документы, что позволяет более детально Удалить дубликаты Функция。
У вас есть индекс, содержащий информацию о продуктах, и вы хотите дедуплицировать продукты по полю «Бренд», чтобы для каждого бренда отображался только один репрезентативный продукт. Запрос может выглядеть так:
GET /products/_search
{
"size": 0, // Не возвращает конкретные совпадающие документы, а только совокупный результат.
"aggs": {
"brands": { // агрегирование терминов, сгруппированное по брендам
"terms": {
"field": "brand",
"size": 10 // Предположим, мы хотим получить 10 лучших брендов продуктов.
},
"aggs": {
"top_product": { // В каждой группе брендов используйте агрегирование top_hits возвращает типичные продукты
"top_hits": {
"size": 1, // Для каждого бренда возвращается только один репрезентативный товар.
"sort": [ // При необходимости вы можете указать метод сортировки, например, по рейтингу или цене.
{
"_score": { // по рейтингусортировать "order": "desc"
}
}
]
}
}
}
}
}
}
Сначала мы используем агрегирование терминов для группировки товаров по полю «бренд», а затем используем агрегирование в каждой группировке. top_hits возвращает один репрезентативный продукт (продукт с самым высоким рейтингом). Таким образом, мы реализовали Удалить по бренду. Функции дубликатов.
terms
)+ top_hits
полимеризацияterms
полимеризациянажиматьиндивидуальный Полеизценитьгруппа,Затемвнутри каждой группыиспользоватьtop_hits
полимеризация来获取Каждыйиндивидуальный分Группаизверхний документ。terms
полимеризацияиз Поле,киtop_hits
полимеризациявозвращаться Документацияколичествоисортировать Способ。collapse
Функцияcollapse
Функция Указаводининдивидуальный Поле来对搜索результатгруппа,И только один наиболее подходящий документ возвращается для каждой группы (обычно на основе самого высокого или самого низкого значения поля сортировки).top_hits
поставлять了更многоиз Пользовательские параметры,Можно группировать по нескольким полям,и контрольвозвращаться Документацияколичествоисортировать。иcollapse
проще и прямее,Группа на основе только одного поля.collapse
может быть более эффективным,Потому что это позволяет избежать сложных вычислений агрегирования. Однако,Фактическая производительность также зависит от конкретного сценария использования и распределения данных.top_hits
可квозвращатьсябогачеизинформация,包括分Группа大小имногоиндивидуальныйпредставлятьдокумент。иcollapse
Тольковозвращаться Каждыйиндивидуальный分Группаиз最佳документ。При выборе метода использования,Следует взвешивать с учетом конкретных потребностей, объема данных и требований к производительности. Если вам нужна подробная статистическая информация по группировке и несколько репрезентативных документов,Агрегация полей+top_hits
может быть лучшеизвыбирать。如果你Только需хотеть快速获取Каждыйиндивидуальный分Группаиз最佳документ,исосредоточиться напроизводительность,Такcollapse
может быть более подходящим для вас。
Агрегация мощности — это функция, используемая для подсчета количества различных значений в поле (то есть числа после дедупликации).
Предположим, у вас есть индекс Elasticsearch, содержащий данные о продажах продуктов, и вы хотите подсчитать, сколько разных цветов содержится в поле «цвет». Вы можете сделать это, используя следующий запрос:
GET /sales/_search
{
"query": {
"range": {
"date": {
"gte": "2024-01-01",
"lte": "2024-06-30"
}
}
},
"size": 0,
"aggs": {
"distinct_colors_in_period": {
"cardinality": {
"field": "color" ,
"precision_threshold": 1000
}
}
}
}
Этот запрос возвращает совокупный результат, содержащий количество различных цветов в поле «цвет».
Метрика мощности представляет собой аппроксимационный алгоритм. Он основан на алгоритме HyperLogLog++ (HLL). HLL сначала выполнит хеш-операцию над нашими входными данными, а затем оценит вероятность на основе битов в результате хэш-операции для получения мощности.
Нам не нужно разбираться в технических деталях, но лучше обратить внимание на характеристики этого алгоритма:
Чтобы настроить точность, мы должны указать значение параметра Precision_threshold. Этот порог определяет уровень мощности, при котором мы хотим получить почти точный результат.
{
"query": {
"bool": {
"filter": [
{
"range": {
"personid": {
"lt": "1000000000"
}
}
},
{
"term": {
"isDeleted": "0"
}
}
]
}
},
"collapse": {
"field": "course_id"
},
"from": 0,
"size": 10,
"track_total_hits": true,
"aggs": {
"courseAgg": {
"cardinality": {
"field": "course_id"
}
}
}
}
возвращатьсярезультат:
{
"took": 140,
"timed_out": false,
"_shards": {
"total": 6,
"successful": 6,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2111,
"relation": "eq"
},
"max_score": 0.0,
"hits": [...]
},
"aggregations": {
"courseAgg": {
"value": 1070
}
}
}
Объяснение:
hits
вtotal
Поле显示изобщий Количество предметов,По сути, это запрос общего количества результатов перед Удалить дубликаты.,То есть оригиналданныеиз Количество предметов。этотиндивидуальный数ценитьсуществовать Пагинация Функцияобычно не являются напрямуюиспользовать。иhits
数Группаизразмер иaggregations
вcourseAgg
полимеризацияценить相等,表示数Группа中展示изда Удалить дубликатыназадизданные。 aggregations
вcourseAgg
Количество предметов,представлять Удалить Фактическое количество данных после дубликатов, которое также является значением ключа, используемым при разбиении на страницы, что указывает Удалить. Общее количество товаров, доступных для отображения после дубликаты.
from
参数表示Запросизростисходное положение,То есть с чего начать поиск данных,Это эквивалентно смещению запроса.size
参数定义了Каждый次Запросвозвращатьсяизданные Количество предметов,То есть, сколько записей извлекается и отображается.