web-dev-qa-db-fra.com

Comment supprimer des documents d'Elasticsearch

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?

18
Jacobian

É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'})
31
Serkan

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;)

7
Chaoste

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

1
Jay Patel