web-dev-qa-db-ja.com

Elasticsearchからドキュメントを削除する方法

PythonでElasticsearchからドキュメントを削除する例は見つかりません。私が今見たのは、deleteおよびdelete_by_query関数の定義です。しかし、何らかの理由で documentation はこれらの関数を使用する微視的な例すら提供していません。パラメータの単一リストでは、関数呼び出しにパラメータを正しく入力する方法がわからない場合、あまり説明しません。したがって、次のように新しいドキュメントを1つ挿入しただけです。

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

deletedelete_by_queryを使用してこのドキュメントを削除する方法を知っている人は誰ですか?

18
Jacobian

ドキュメントのインデックス作成時にドキュメントIDを指定していないため、戻り値から自動生成されたドキュメントIDを取得し、IDに従って削除する必要があります。または、自分でIDを定義することもできます。次を試してください。

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

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

それ以外の場合は、戻り値を調べる必要があります。

 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'])

Delete_by_queryの別の例。 name = 'Jacobian'のドキュメントをいくつか追加した後、次を実行してname = 'Jacobian'のドキュメントをすべて削除するとしましょう。

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

Delete-By-Query APIは、いくつかの理由でバージョン2のESコアから削除されました。この関数はプラグインになりました。詳細についてはこちらをご覧ください:

クエリによる削除がプラグインである理由

クエリプラグインによる削除

別の依存関係を追加したくなかったので(後でdockerイメージで実行する必要があるため)、この問題を解決する独自の関数を作成しました。私の解決策は、指定されたインデックスとタイプですべての引用符を検索することです。その後、Bulk APIを使用してそれらを削除します。

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

これが将来のグーグルに役立つことを願っています;)

7
Chaoste

次のようなこともできます。

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'])

バルクデータに対して削除操作を実行します

1
Jay Patel