タイプを削除せずにインデックス/タイプからすべてのドキュメントを削除します


155

deleteByQueryを使用して、特定のタイプのすべてのドキュメントを削除できることを知っています。

例:

curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d '{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}'

しかし、私には用語がなく、どのような用語であっても、そのタイプからすべてのドキュメントを削除したいだけです。これを達成するためのベストプラクティスは何ですか?空の用語は機能しません。

deleteByQueryへのリンク

回答:


175

クエリによる削除を一致と組み合わせると、次のようなもの(例を使用)が求めるものをすべて実行できるはずです:

curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d '{
    "query" : { 
        "match_all" : {}
    }
}'

または、タイプを削除することもできます。

curl -XDELETE http://localhost:9200/twitter/tweet

9
カスタムマッピングがある場合。2番目のオプションはタイプとそのマッピングを削除することに注意してください。したがって、削除後にインデックスタイプを再マップすることを忘れないでください。さもなければ、あなたはめちゃくちゃになります。
Finny Abraham


2
この方法でレコードを削除することはお勧めしません。ドキュメントの「Hereステートメント」:「サイレントに強制的に更新されるため、同時インデックス作成中にOutOfMemoryErrorがすぐに発生する可能性があるため、問題があります」elastic.co/guide/en/elasticsearch/reference/1.7/ …
usef_ksa

3
Ftr:クエリプラグインによる削除は、バージョン5 からESコアに戻されます
Val

11
「uriのハンドラーが見つかりません...」エラーが発生した場合は、curl -XPOST 'localhost:9200 / twitter / tweet / _delete_by_query?conflicts = proceed&pretty' -d '{"query":{"match_all":{}}を使用します} '
Iqbal

70

Delete-By-Queryプラグインが削除され、コアに新しいDelete By Query API実装が導入されました。こちらをお読みください

curl -XPOST 'localhost:9200/twitter/tweet/_delete_by_query?conflicts=proceed&pretty' -d'
{
    "query": {
        "match_all": {}
    }
}'

1
es 5.4で私のために働いた
jlunavtgrad

2
ES 6.1.1で私のために働いた
セバスチャン

7
ES 6+には、次も必要です-H 'Content-Type: application/json'
OMRY VOLK 2018年

57

ElasticSearch 5.x以降、delete_by_query APIがデフォルトで存在します

POST: http://localhost:9200/index/type/_delete_by_query

{
    "query": { 
        "match_all": {}
    }
}

子ノードで機能するため、これは素晴らしいです(他の回答のいくつかは、その場合、「routing_missing_exception」が原因で失敗します)
dnault 20

16

John Petronesの回答におけるTorsten Engelbrechtのコメントが拡張されました:

curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d 
  '{
      "query": 
      {
          "match_all": {}
      }
   }'

(私はジョンの返信を編集したくありませんでした。それは賛成票を得て回答として設定されているためです。エラーが発生した可能性があります)


1
@ChristopheRoussyいいえ、追加のプラグインがない場合、John
Petroneの

16

次のクエリを使用して、タイプからドキュメントを削除できます。

POST /index/type/_delete_by_query
{
    "query" : { 
        "match_all" : {}
    }
}

このクエリをKibanaとElastic 5.5.2でテストしました


13

Elasticsearch 2.x以降では、ドキュメントがインデックスに残っているためインデックスが破損するため、削除はできなくなりました。


1
それで解決策は何ですか?
Christophe Roussy

1
インデックスのエイリアスに基づくソリューションを使用します。主なアイデアは、毎回新しいインデックスを作成news1, news2 and so onし、newsパスへの現在アクティブなインデックスのエイリアスを設定することです。もちろん、インデックスの名前は単なる例です。ここには、[インデックスエイリアス](elastic.co/guide/en/elasticsearch/reference/current/…)の完全な例と、ケーススタディを説明する記事があります。
Fabio Fumarola、2016年

10

Elasticsearch RESTリクエスト厳密なコンテンツタイプチェックのため、上記の回答はES 6.2.2では機能しません。curl私が使用して終了コマンドはこれです:

curl -H'Content-Type: application/json' -XPOST 'localhost:9200/yourindex/_doc/_delete_by_query?conflicts=proceed' -d' { "query": { "match_all": {} }}'

1
公式ドキュメントによると、URLの_doc部分を削除する必要がありました。
MarkSchäfer19年

6

Kibanaコンソール:

POST calls-xin-test-2/_delete_by_query
{
  "query": { 
    "match_all": {}
  }
}

6

これらの選択肢があります:

1)インデックス全体を削除します。

curl -XDELETE 'http://localhost:9200/indexName'             

例:

curl -XDELETE 'http://localhost:9200/mentorz'

詳細については、こちらをご覧ください-ご覧ください-https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

2)一致するものをクエリで削除:

curl -XDELETE 'http://localhost:9200/mentorz/users/_query' -d                
    '{
        "query":
            {
                "match_all": {}
            }
    }'

*ここでmentorzはインデックス名で、usersはタイプです


5

ES2 +に関する注意

ES 1.5.3以降、delete-by-query APIは非推奨になり、ES 2.0以降は完全に削除されました

APIではなくDelete By Queryがプラグインになりました

Delete By Queryプラグインを使用するには、クラスターのすべてのノードにプラグインをインストールする必要があります。

sudo bin/plugin install delete-by-query

インストール後にすべてのノードを再起動する必要があります。


プラグインの使用法は古いAPIと同じです。クエリで何も変更する必要はありません-このプラグインはそれらを機能させるだけです。


* APIが削除された理由の詳細については、こちらをご覧ください


私の経験から、DeleteByQueryプラグインは大量のドキュメントを処理するとパフォーマンスが非常に低下します。ES 2.3.2でテスト済み。
ibai

1
@ ibai、ES 2.2.0で使用し、インデックスに数百万のドキュメントが含まれていて、時間がかかりませんでした(1.7の元のクエリAPIによる削除とほぼ同じ時間)。とにかく-APIが有効ではなくなったため、ここではあまり選択肢はないと思います。
2016

4

(評判はコメントするには十分ではありません)John Petroneの回答の2番目の部分は機能します-クエリは必要ありません。タイプとそのタイプに含まれるすべてのドキュメントが削除されますが、新しいドキュメントにそのタイプにインデックスを付けるといつでも再作成できます。

明確にするために: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

注:これによりマッピング削除されます!ただし、前述のように、新しいドキュメントを作成することで簡単に再マッピングできます。


2
しかし、あなたは、あなたが持っているすべてのマッピング設定いただきました!を削除するには、任意のマッピングのための具体的な構成を持っている場合、動的なマッピングのみなど、長い文字列、などの基本的なフィールドを作成するので、それは...、お勧めしません
カルロス・ロドリゲス

1
@CarlosRodriguezしかし、あなたが持っているどんな派手なマッピングも確かにソース管理にあり、削除を実行しているのと同じスクリプトの一部として自動的に再適用するのは非常に簡単です。
ジョナサンハートレイ2016年

この回答は、「すべてのドキュメントを削除する...タイプを削除せずに」という質問とは正反対です。あなたのプロジェクトに基づいてマッピングを簡単に再作成するのがどれほど簡単であるかを想定しないでください。他のプロジェクトには、バージョン管理/移行などをマッピングするためのより複雑な手順がある場合があります。
VeganHunter 2018

3

elasticsearch 7.5を使用しています。

curl -XPOST 'localhost:9200/materials/_delete_by_query?conflicts=proceed&pretty' -d'
{
    "query": {
        "match_all": {}
    }
}'

これはエラーをスローします。

{
  "error" : "Content-Type header [application/x-www-form-urlencoded] is not supported",
  "status" : 406
}

-H 'Content-Type: application/json'リクエストにヘッダーを追加して機能させることも必要です。

curl -XPOST 'localhost:9200/materials/_delete_by_query?conflicts=proceed&pretty'  -H 'Content-Type: application/json' -d'
{
    "query": {
        "match_all": {}
    }
}'
{
  "took" : 465,
  "timed_out" : false,
  "total" : 2275,
  "deleted" : 2275,
  "batches" : 3,
  "version_conflicts" : 0,
  "noops" : 0,
  "retries" : {
    "bulk" : 0,
    "search" : 0
  },
  "throttled_millis" : 0,
  "requests_per_second" : -1.0,
  "throttled_until_millis" : 0,
  "failures" : [ ]
}

これは6.7.2で動作します。
rooch84


0

Elasticsearch 2.3オプション

    action.destructive_requires_name: true

elasticsearch.ymlで旅行を行います

    curl -XDELETE http://localhost:9200/twitter/tweet

-1

日付に応じて文書を削除したい場合。kibanaコンソール(v.6.1.2)を使用できます

POST index_name/_delete_by_query
{
      "query" : {
              "range" : {
                 "sendDate" : {
                     "lte" : "2018-03-06"
                              }
                        }
                  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.