Elasticsearch находит дубликаты документов по значению столбца

#elasticsearch #duplicates

#elasticsearch #дубликаты

Вопрос:

Я хочу удалить все дублирующиеся документы в индексе. Я начал с попытки обнаружить дублирующиеся элементы с помощью следующего запроса.
Эластичный файл был раздавлен, потому java.lang.OutOfMemoryError: Java heap space что . размер кучи составляет 32 ГБ и 500 000 000 документов

  1. как мне найти дублированные значения. группируйте по item.category и item.profile (оба определены как ключевое слово).
  2. как удалить эти дублированные элементы?
 GET /requests/_search
{
  "size": 0,
  "aggs": {
    "duplicateCount": {
      "terms": {
        "field": "item.text",
        "min_doc_count": 2
      },
      "aggs": {
        "duplicateDecuments": {
          "top_hits": {
           
          }
        }
      }
    }
  }
}
 

Спасибо

Ответ №1:

Я бы написал внешний скрипт для запроса идентификаторов документов с нумерацией страниц и запустил несколько delete_by_query.

Вы можете использовать «раздел» в вашей агрегации, как описано в статье ниже, для разбивки ваших агрегатов на страницы. https://spoon-elastic.com/all-elastic-search-post/pagination-aggregation-elasticsearch /

Если у вас достаточно места, вы также можете использовать внешний индекс с переиндексацией. С помощью приемного трубопровода вы можете :

  1. создайте уникальный ключ (item.category — item.profile..) и используйте его как _id
  2. переиндексируйте в этом индексе. Это удалит дубликаты
  3. используйте этот новый индекс или пустой старый индекс и переиндексируйте его обратно.

Или другое решение — это :

  1. создайте уникальный ключ (item.category — item.profile..) и используйте его как _id
  2. переиндексируйте в этом индексе и сохраните только уникальный идентификатор, например _source.id
  3. используйте все идентификаторы для записи внешнего scipt для создания delete_by_query для удаления всех документов с этими идентификаторами.

помните, что :

  • удаление в эластичном поиске — это мягкое удаление. потребуется время, прежде чем ES освободит место.
  • чтобы сохранить хорошую производительность после большого удаления, лучше всего выполнить force_merge https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-forcemerge.html