Elasticsearch: удаление дубликатов из индекса

у меня есть индекс с несколькими повторяющимися записями. Они имеют разные идентификаторы, но другие поля имеют одинаковое содержимое.

например:

{id: 1, content: 'content1'}
{id: 2, content: 'content1'}
{id: 3, content: 'content2'}
{id: 4, content: 'content2'}

после удаления дубликатов:

{id: 1, content: 'content1'}
{id: 3, content: 'content2'}

есть ли способ удалить все дубликаты и сохранить только одну отдельную запись без ручного сравнения всех записей?

2 ответов


Я использую rails, и при необходимости я буду импортировать вещи с FORCE=y команда, которая удаляет и повторно индексирует все для этого индекса и типа... однако не уверен, в какой среде вы используете ES. Единственная проблема, которую я вижу, - это если источник данных, из которого вы импортируете (т. е. база данных), имеет повторяющиеся записи. Думаю, сначала я бы увидел, можно ли исправить источник данных, если это возможно, и вы переиндексируете все; в противном случае вы можете попытаться создать пользовательский метод импорта, который только индексирует один из повторяющихся элементов для каждой записи.

кроме того, и я знаю, что это не соответствует вашему желанию удалить дубликаты записей, но вы можете просто настроить свой поиск так, чтобы вы возвращали только один из дубликатов идентификаторов, либо по самой последней "метке времени", либо индексируя дедуплицированные данные и группируя их по полю содержимого-смотрите, если этот пост поможет. Даже если это все равно сохранит дубликаты записей в вашем индексе, по крайней мере, они не будут подняться в результатах поиска.

Я также нашел это:Elasticsearch удалить дубликаты

Я попытался подумать о многих возможных сценариях для вас, чтобы увидеть, работает ли какой-либо из этих вариантов или, по крайней мере, может быть временным исправлением.


это может быть достигнуто несколькими способами. Ниже я обрисовываю два возможных подхода:--9-->

1) Если вы не против создания новых _id значения и переиндексация всех документов в новую коллекцию, затем вы можете использовать Logstash и фильтр для создания уникального отпечатка пальца (хэша) из полей, которые вы пытаетесь де-дублировать, и использовать этот отпечаток пальца как _id для документов по мере их записи в новую коллекцию. Поскольку _id поле должно быть уникальным, любые документы, имеющие одинаковый отпечаток пальца, будут записаны в одно и то же _id и поэтому дедуплицированы.

2) Вы можете написать пользовательский скрипт, который прокручивает ваш индекс. При чтении каждого документа можно создать хэш из полей, которые вы считаете уникальными (в вашем случае