Je ne trouve aucun exemple de suppression de documents de Elasticsearch
en Python. Ce que j'ai vu maintenant - c'est la définition de delete
et delete_by_query
les fonctions. Mais pour une raison quelconque documentation ne fournit même pas un exemple microscopique d'utilisation de ces fonctions. La liste unique de paramètres ne m'en dit pas trop, si je ne sais pas comment les alimenter correctement dans l'appel de fonction. Donc, disons, je viens d'insérer un nouveau document comme ceci:
doc = {'name':'Jacobian'}
db.index(index="reestr",doc_type="some_type",body=doc)
Qui dans le monde sait comment puis-je supprimer ce document à l'aide de delete
et delete_by_query
?
Étant donné que vous ne donnez pas d'ID de document lors de l'indexation de votre document, vous devez obtenir l'ID de document généré automatiquement à partir de la valeur de retour et le supprimer en fonction de l'ID. Ou vous pouvez définir l'ID vous-même, essayez ce qui suit:
db.index(index="reestr",doc_type="some_type",id=1919, body=doc)
db.delete(index="reestr",doc_type="some_type",id=1919)
Dans l'autre cas, vous devez examiner la valeur de retour;
r = db.index(index="reestr",doc_type="some_type", body=doc)
# r = {u'_type': u'some_type', u'_id': u'AU36zuFq-fzpr_HkJSkT', u'created': True, u'_version': 1, u'_index': u'reestr'}
db.delete(index="reestr",doc_type="some_type",id=r['_id'])
Un autre exemple pour delete_by_query. Disons qu'après avoir ajouté plusieurs documents avec name = 'Jacobian', exécutez ce qui suit pour supprimer tous les documents avec name = 'Jacobian':
db.delete_by_query(index='reestr',doc_type='some_type', q={'name': 'Jacobian'})
L'API Delete-By-Query a été supprimée du noyau ES dans la version 2 pour plusieurs raisons. Cette fonction est devenue un plugin. Vous pouvez rechercher plus de détails ici:
Pourquoi Delete-By-Query est un plugin
Supprimer par plug-in de requête
Parce que je ne voulais pas ajouter une autre dépendance (parce que j'en aurai besoin plus tard pour exécuter dans une image docker), j'ai écrit une propre fonction pour résoudre ce problème. Ma solution consiste à rechercher toutes les citations avec l'index et le type spécifiés. Après cela, je les supprime à l'aide de l'API Bulk:
def delete_es_type(es, index, type_):
try:
count = es.count(index, type_)['count']
response = es.search(
index=index,
filter_path=["hits.hits._id"],
body={"size": count, "query": {"filtered" : {"filter" : {
"type" : {"value": type_ }}}}})
ids = [x["_id"] for x in response["hits"]["hits"]]
if len(ids) > 0:
return
bulk_body = [
'{{"delete": {{"_index": "{}", "_type": "{}", "_id": "{}"}}}}'
.format(index, type_, x) for x in ids]
es.bulk('\n'.join(bulk_body))
# es.indices.flush_synced([index])
except elasticsearch.exceptions.TransportError as ex:
print("Elasticsearch error: " + ex.error)
raise ex
J'espère que cela aide les futurs googleurs;)
On peut aussi faire quelque chose comme ça:
def delete_by_ids(index, ids):
query = {"query": {"terms": {"_id": ids}}}
res = es.delete_by_query(index=index, body=query)
pprint(res)
# Pass index and list of id that you want to delete.
delete_by_ids('my_index', ['test1', 'test2', 'test3'])
Qui effectuera l'opération de suppression sur les données en masse