I use python for find and delete duplicate documents in Elasticsearch
I use this script but i have an error
#!/usr/local/bin/python3
import hashlib
from elasticsearch import Elasticsearch
es = Elasticsearch(["localhost:9200"])
dict_of_duplicate_docs = {}
# La ligne suivante définit les champs qui seront
# utilisés pour déterminer si un document est un doublon ou non
keys_to_include_in_hash = ["chaine", "job", "date_plan", "statut", "date_debut", "date_fin", "serveur", "numero_passage", "application", "sous_application"]
# Traitement des documents renvoyés par la recherche actuelle ou le défilement
def populate_dict_of_duplicate_docs(hits):
for item in hits:
combined_key = ""
for mykey in keys_to_include_in_hash:
combined_key += str(item['_source'][mykey])
_id = item["_id"]
hashval = hashlib.md5(combined_key.encode('utf-8')).digest()
# Si la valeur du hachage (hashval) est nouvelle, nous créerons une nouvelle clé
# dans dict_of_duplicate_docs, qui se verra attribuer
# une valeur d’un tableau vide.
# Nous intégrerons ensuite immédiatement la valeur _id dans le tableau.
# Si la valeur hashval existe déjà, alors
# nous indiquerons tout simplement la nouvelle valeur _id dans le tableau existant.
dict_of_duplicate_docs.setdefault(hashval, []).append(_id)
# Créez une boucle avec tous les documents de l’index, puis renseignez la
# structure de données dict_of_duplicate_docs.
def scroll_over_all_docs():
data = es.search(index="hello", scroll='1m', body={"query": {"match_all": {}}})
# Obtenez l’ID de défilement
sid = data['_scroll_id']
scroll_size = len(data['hits']['hits'])
# Avant de procéder au défilement, traitez le lot de résultats en cours
populate_dict_of_duplicate_docs(data['hits']['hits'])
while scroll_size > 0:
data = es.scroll(scroll_id=sid, scroll='2m')
# Traitez le lot de résultats en cours
populate_dict_of_duplicate_docs(data['hits']['hits'])
# Mettez l’ID de défilement à jour
sid = data['_scroll_id']
# Obtenez le nombre de résultats renvoyés lors du dernier défilement
scroll_size = len(data['hits']['hits'])
def loop_over_hashes_and_remove_duplicates():
# Parcourez les valeurs de hachage pour déterminer s’il existe
# des hachages en double
for hashval, array_of_ids in dict_of_duplicate_docs.items():
if len(array_of_ids) > 1:
print("********** Duplicate docs hash=%s **********" % hashval)
# Obtenez les documents mappés à la valeur hashval actuelle
matching_docs = es.mget(index="hello", doc_type="doc", body={"ids": array_of_ids})
for doc in matching_docs['docs']:
# Dans cet exemple, nous avons simplement imprimé les documents en double.
# Il est tout à fait possible (et simple !) de modifier ce code pour supprimer les doublons
# ici au lieu de les imprimer.
print("doc=%s\n" % doc)
def main():
scroll_over_all_docs()
loop_over_hashes_and_remove_duplicates()
main()