Дедупликация Elasticsearch: коллапс, мощность, краткий обзор реализации terms+top_hits
Дедупликация Elasticsearch: коллапс, мощность, краткий обзор реализации terms+top_hits

1. свернуть, чтобы удалить дубликаты

elasticsearchвcollapseфункция позволяет пользователям искатьрезультатгруппа,В некоторых случаях это можно рассматривать как один из видов операции «Удалить дубликаты». Его основное предназначение – поиск больших объемов документов.,Отображать только один репрезентативный документ для каждой группы.,Вместо показа всех соответствующих документов.

принцип

collapseФункция, основанная наодин Поиск пар значений одного или нескольких полейрезультатгруппа。Когда вы укажетеcollapseПосле параметров,Elasticsearch автоматически группирует совпадающие документы.,При этом для каждой группы будет возвращен только один представительский документ. Этот репрезентативный документ обычно является одиннадцатым документом в группе.,Но его также можно настроить с помощью других параметров.

использование

Вот какElasticsearchИспользуется в запросахcollapseБазовый пример:

Язык кода:javascript
копировать
{
  "query": {
    "match": {
      "field": "value"
    }
  },
  "collapse": {
    "field": "group_field"
  }
}

В этом примере:

  • queryЧастично определяет основные условия поиска。В этом примере,наши поля поискаfieldЗначениеvalueДокументация。
  • collapseЧастично определяет поля, используемые для группировки,Прямо сейчасgroup_field。всесуществоватьэтотиндивидуальный Поля с одинаковым значением Документациябудут сгруппированысуществоватьодинрост,И возвращается только один представительский документ.

Вы также можете добавитьinner_hitsПараметры для настройки возвращаемого документа представителя группы。Например,Если вы хотите вернуть документ с наивысшим рейтингом в каждой группе,Вы можете сделать это:

Язык кода:javascript
копировать
{
  "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)Сортировать по убываниюсортировать,Таким образом, репрезентативным документом для каждой группы будет документ с наивысшим рейтингом в этой группе.
На что следует обратить внимание
  1. Накладные расходы на производительность:в большомданные Интегрированное приложениеcollapseФункцияможет принести дополнительныеиз Накладные расходы на производительность, из-за необходимости группировать и сортировать операции по результату.
  2. Сложность пагинации:При использовании в сочетании с функцией пейджинга,Следует отметить, что разбиение страниц Elasticsearch основано на порядке индекса.,а не сложенный порядок,Это может вызвать проблемы с производительностью или несогласованность результатов при глубокой разбивке по страницам.
  3. нельзя использовать сscrollrescoreиsearch_afterИспользуется совместно с: потому чтоcollapseнужнорезультатгруппаисортироватьопределить каждыйиндивидуальный Группаизлучший соответствующий документ,Этот процесс может быть связан сscrollrescoreиsearch_afterизнекоторый Функцияконфликт。
  4. Производительность:Хотяcollapseобычно лучше, чем полностьюиз分Группаиполимеризация Работайте более эффективно,Потому что он возвращает только лучший документ для каждой группы.,Однако «Накладные» все равно могут возникать при обработке больших объемов данных. расходы на производительность。
  5. Тип поляcollapseместо параметраиспользоватьиз Поле должно бытьkeywordилиnumberтип,Поскольку эти типы значений полей являются точными,适используется для分Группаисортировать。использоватьtextтип Поля могут вызывать неточностиизрезультат。

существоватьиспользоватьcollapseчас,Обязательно учтите эти ограничения и лучший способ сделать это.,Чтобы обеспечить точность запроса и производительность. Правильно планируя и оптимизируя запросы,может быть использован полностьюcollapseиз分Группа Функция,Избегая при этом потенциальных узких мест производительности.

2. Агрегация полей (термины) + агрегация top_hits для удаления дубликатов

Используйте вместе с Агрегация. полей (условия)иагрегирование top_hits может добиться Удалить дубликаты Функция。

принцип
  1. Агрегация полей (условия):этотполимеризациятиписпользуется для отображенияиндивидуальный Полевтолькоодинценитьиего переписка Документацияколичество。Агрегировать по полю,Мы можем группировать данные по разным значениям указанного поля.
  2. агрегирование top_hits:этотполимеризациятиписпользуется длясуществовать Каждыйиндивидуальный分Группа(bucket)внутреннийвозвращатьсялучший матч Документация。когда сtermsполимеризация Используется совместно счас,Он может возвращать определенное количество документов в каждой группе.,Обычно используется для возврата репрезентативных документов для каждой группы.

Объединив эти две агрегации, мы можем сначала выполнить группировку по определенному полю (выполнив предварительную «Удалить эффект «дубликации», то есть каждая группировка представляет собой уникальное значение поля), а затем использовать агрегирование в каждой группировке. top_hits возвращает репрезентативные документы, что позволяет более детально Удалить дубликаты Функция。

использование
  1. Создайте базовый запрос:первый,Вам необходимо создать базовый запрос Elasticsearch.,Используется для фильтрации того, что необходимо сделать.Удалить Сбор документов, обработанных дубликатами.
  2. Добавить агрегацию терминов:существовать Запросизполимеризациячасть,Добавить одну агрегацию терминов,и укажите поля, по которым необходимо сгруппировать. так,Elasticsearch сгруппирует все документы по уникальному значению этого поля.
  3. Вложенное агрегирование top_hits:существоватьtermsполимеризацияиз Каждыйиндивидуальный分Группа中,Вложенныйодининдивидуальныйагрегирование топ_хиты. Таким образом, внутри каждой группы вы можете указать количество наиболее подходящих документов для возврата (обычно 1, чтобы добиться Удалить дубликаты Эффект)。
  4. (Необязательно) Настройте top_hits:ты можешь войтиодинпошаговая настройкаагрегирование top_hits, например, указав метод сортировки для управления возвращаемыми репрезентативными документами.

У вас есть индекс, содержащий информацию о продуктах, и вы хотите дедуплицировать продукты по полю «Бренд», чтобы для каждого бренда отображался только один репрезентативный продукт. Запрос может выглядеть так:

Язык кода:javascript
копировать
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 возвращает один репрезентативный продукт (продукт с самым высоким рейтингом). Таким образом, мы реализовали Удалить по бренду. Функции дубликатов.

3. Сравнение двух методов

Агрегация полей(terms)+ top_hitsполимеризация
  • принцип:этот种方法первыйиспользоватьtermsполимеризациянажиматьиндивидуальный Полеизценитьгруппа,Затемвнутри каждой группыиспользоватьtop_hitsполимеризация来获取Каждыйиндивидуальный分Группаизверхний документ。
  • гибкость:очень высокий。вы можете настроитьtermsполимеризацияиз Поле,киtop_hitsполимеризациявозвращаться Документацияколичествоисортировать Способ。
  • производительность:зависит отполимеризация Полеиз Мощность(Прямо сейчас不同ценитьизколичество)。Если база большая,производительность может пострадать,Потому что агрегацию необходимо выполнять для каждого отдельного значения.
  • результат:возвращатьсяизда Каждыйиндивидуальный分Группаизодининдивидуальныйилимногоиндивидуальныйпредставлятьдокумент,и такую ​​информацию, как размер каждой группы.
  • использовать:适используется длянужноданныеруководитьмного维分析истатистикаизсцена。
использоватьcollapseФункция
  • принципcollapseФункция Указаводининдивидуальный Поле来对搜索результатгруппа,И только один наиболее подходящий документ возвращается для каждой группы (обычно на основе самого высокого или самого низкого значения поля сортировки).
  • гибкость:относительно низкий。Вы можете основываться только наодининдивидуальный Полегруппа,При этом на группу возвращается только один документ.
  • производительность:обычно чем Агрегация полейболее эффективный,Потому что не нужно рассчитывать статистическую информацию для каждой группы.,Просто найдите наиболее подходящий документ для каждой группы.
  • результат:возвращатьсяизда Каждыйиндивидуальный分Группаизлучший соответствующий документ。
  • использовать:适используется для Только需хотеть获取Каждыйиндивидуальный分Группаизпредставлятьдокумент,Сценарии, не требующие подробной статистической информации.
Сводка сравнения
  • гибкость:Агрегация полей+top_hitsпоставлять了更многоиз Пользовательские параметры,Можно группировать по нескольким полям,и контрольвозвращаться Документацияколичествоисортировать。иcollapseпроще и прямее,Группа на основе только одного поля.
  • производительность:для большогоданныенабор,collapseможет быть более эффективным,Потому что это позволяет избежать сложных вычислений агрегирования. Однако,Фактическая производительность также зависит от конкретного сценария использования и распределения данных.
  • результатбогатство:Агрегация полей+top_hits可квозвращатьсябогачеизинформация,包括分Группа大小имногоиндивидуальныйпредставлятьдокумент。иcollapseТольковозвращаться Каждыйиндивидуальный分Группаиз最佳документ。

При выборе метода использования,Следует взвешивать с учетом конкретных потребностей, объема данных и требований к производительности. Если вам нужна подробная статистическая информация по группировке и несколько репрезентативных документов,Агрегация полей+top_hitsможет быть лучшеизвыбирать。如果你Только需хотеть快速获取Каждыйиндивидуальный分Группаиз最佳документ,исосредоточиться напроизводительность,Такcollapseможет быть более подходящим для вас。

4. Кардинальность подсчитывает количество после дедупликации

Агрегация мощности — это функция, используемая для подсчета количества различных значений в поле (то есть числа после дедупликации).

принцип
  1. На основе алгоритма HyperLogLog++.:cardinalityполимеризацияоснован наHyperLogLog++(HLL)алгоритмизприблизительныйалгоритм。HLLВвод сначала будет хеширован.,Затем сделайте оценку вероятности на основе битов в операции хеширования.,чтобы получить базовую стоимость,Это количество различных значений.
  2. приблизительныйрезультат:нужно вниманиеизда,За счет использования алгоритма HLL,Агрегация мощности дает приблизительный результат,а не точное значение. но в большинстве случаев,Это приближение достаточно точное,Может удовлетворить потребности бизнеса.
  3. производительностьоптимизация:дляпродвинутыйпроизводительность,Elasticsearch использует определенные стратегии оптимизации при обработке больших коллекций.,Например, для ускорения вычислительного процесса используются такие методы, как группирование и параллельная обработка.
использование
  1. Базаиспользование:хотетьиспользоватьcardinalityполимеризация,Вам необходимо указать одну агрегацию мощности в запросе запроса Elasticsearch.,И установите в полях статистику. Например,Если вы хотите количество разных значений для поля «цвет» в статистикеодин,Вы можете отправить запрос, содержащий агрегацию мощности.
  2. Вложен в другие агрегаты:cardinalityполимеризация还可к Вложен в другие агрегаты, такие как агрегация date_histogram. Таким образом, вы можете отслеживать количество различных значений по временным интервалам (например, ежемесячно, ежедневно и т. д.). Это полезно для анализа количества уникальных значений во временном ряду.
  3. Точность регулировки:Хотяcardinalityполимеризацияпоставлятьиздаприблизительныйрезультат,Но вы можете снизить точность и производительность, настроив соответствующие параметры. Elasticsearch позволяет устанавливать пороги точности,Для получения более быстрых результатов вычислений в разумном диапазоне ошибок.

Предположим, у вас есть индекс Elasticsearch, содержащий данные о продажах продуктов, и вы хотите подсчитать, сколько разных цветов содержится в поле «цвет». Вы можете сделать это, используя следующий запрос:

Язык кода:javascript
копировать
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  

      }  
    }  
  }  
}

Этот запрос возвращает совокупный результат, содержащий количество различных цветов в поле «цвет».

описание параметра Precision_threshold

Метрика мощности представляет собой аппроксимационный алгоритм. Он основан на алгоритме HyperLogLog++ (HLL). HLL сначала выполнит хеш-операцию над нашими входными данными, а затем оценит вероятность на основе битов в результате хэш-операции для получения мощности.

Нам не нужно разбираться в технических деталях, но лучше обратить внимание на характеристики этого алгоритма:

  • Настраиваемая точность для контроля использования памяти (больше точности = больше памяти).
  • Точность небольших наборов данных очень высока.
  • Мы можем установить фиксированное использование памяти, необходимое для дедупликации, через параметры конфигурации. Независимо от того, существуют ли тысячи или миллиарды уникальных значений, использование памяти зависит только от точности вашей конфигурации.

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

  • Precision_threshold принимает числа от 0 до 40 000, большие значения по-прежнему будут считаться 40 000.
  • Приведенный выше пример гарантирует, что, когда уникальное значение поля находится в 1000 В пределах этого диапазона вы получите очень точный результат. Хотя алгоритм не может этого гарантировать, если мощность ниже порога, он почти всегда будет 100% Правильный. Мощность выше порога начинает экономить память за счет точности, а также вносит ошибки в результат метрики.
  • Для указанного порога HLL Структура данных, вероятно, будет использовать precision_threshold * 8 байт памяти, поэтому должен быть баланс между жертвованием памятью и получением дополнительной точности.
  • На практике порог 100 может обрабатывать миллионы уникальных значений и при этом поддерживать ошибку в пределах 5%.

5. коллапс + кардинальность реализует статистику и запросы дедупликации

Язык кода:javascript
копировать
{
    "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"
            }
        }
    }
}

возвращатьсярезультат

Язык кода:javascript
копировать
{
    "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
        }
    }
}

Объяснение

  1. hitsвtotalПоле显示изобщий Количество предметов,По сути, это запрос общего количества результатов перед Удалить дубликаты.,То есть оригиналданныеиз Количество предметов。этотиндивидуальный数ценитьсуществовать Пагинация Функцияобычно не являются напрямуюиспользовать。иhits数Группаизразмер иaggregationsвcourseAggполимеризацияценить相等,表示数Группа中展示изда Удалить дубликатыназадизданные。
  2. существоватьaggregationsвcourseAggКоличество предметов,представлять Удалить Фактическое количество данных после дубликатов, которое также является значением ключа, используемым при разбиении на страницы, что указывает Удалить. Общее количество товаров, доступных для отображения после дубликаты.
  3. from参数表示Запросизростисходное положение,То есть с чего начать поиск данных,Это эквивалентно смещению запроса.
  4. size参数定义了Каждый次Запросвозвращатьсяизданные Количество предметов,То есть, сколько записей извлекается и отображается.
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose