2015-06-16 40 views
12

Non riesco a trovare alcun esempio di eliminazione di documenti da Elasticsearch in Python. Quello che ho visto ormai - è la definizione delle funzioni delete e delete_by_query. Ma per qualche ragione documentation non fornisce nemmeno un esempio microscopico di utilizzo di queste funzioni. L'unica lista di parametri non mi dice troppo, se non so come inserirli correttamente nella chiamata di funzione. Quindi, consente di dire, ho appena inserito un nuovo documento in questo modo:Come eliminare documenti da Elasticsearch

doc = {'name':'Jacobian'} 
db.index(index="reestr",doc_type="some_type",body=doc) 

Chi nel mondo sa come posso ora cancellare questo documento utilizzando delete e delete_by_query?

risposta

18

Dato che non si assegna un ID documento durante l'indicizzazione del documento, è necessario ottenere l'ID del documento generato automaticamente dal valore restituito ed eliminare in base all'ID. Oppure è possibile definire l'ID autonomamente, provare quanto segue:

db.index(index="reestr",doc_type="some_type",id=1919, body=doc) 

db.delete(index="reestr",doc_type="some_type",id=1919) 

Nell'altro caso, è necessario esaminare il valore restituito;

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 altro esempio per delete_by_query. Diciamo che dopo l'aggiunta di diversi documenti con il nome = 'Jacobiano', eseguire le seguenti operazioni per eliminare tutti i documenti con il nome = 'Jacobian':

db.delete_by_query(index='reestr',doc_type='some_type', q={'name': 'Jacobian'}) 
+0

Potete, per favore, elaborare un po 'di più? Soprattutto, mi interessa il caso in cui non conosco in anticipo 'id' (id = 1919 nel tuo esempio). Lo chiedo perché devo fare l'eliminazione collettiva. – Jacobian

+0

E, come ho chiesto, un esempio di 'delete_by_query' sarà molto apprezzato anche da me e altri neofiti. – Jacobian

+1

Due piccoli esempi di come eliminare tutti i doc dove doc_type = "some_type" e dove doc.name = "John" vale +100500 di reputazione =) – Jacobian

7

Il Delete-By-Query API è stato rimosso dal nucleo ES nella versione 2 Per diverse ragioni. Questa funzione è diventata un plugin. È possibile cercare per maggiori dettagli qui:

Why Delete-By-Query is a plugin

Delete By Query Plugin

Perché non volevo aggiungere un altro dipendenza (perché ho bisogno di questo più tardi per eseguire un'immagine di finestra mobile a) Ho scritto una propria funzione risolvere questo problema. La mia soluzione è cercare tutte le virgolette con l'indice e il tipo specificati. Dopo di che ho rimossi con l'API di massa:

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 

Mi auguro che aiuta Googler future;)

+0

Sembra che l'eliminazione per query sia stata ripristinata e che il plug-in sia stato eliminato. https://www.elastic.co/guide/en/elasticsearch/reference/5.6/docs-delete-by-query.html –

Problemi correlati