유형을 삭제하지 않고 색인 / 유형에서 모든 문서 삭제


163

deleteByQuery를 통해 특정 유형의 모든 문서를 삭제할 수 있다는 것을 알고 있습니다.

예:

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

그러나 나는 용어가 없으며 어떤 용어에 관계없이 해당 유형의 모든 문서를 삭제하고 싶습니다. 이를 달성하기위한 모범 사례는 무엇입니까? 빈 용어는 작동하지 않습니다.

deleteByQuery에 대한 링크

답변:


183

쿼리에 의한 삭제를 일치와 결합하면 다음과 같이 (귀하의 예를 사용하여) 원하는 것을 모두 수행해야한다고 생각합니다.

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

또는 유형을 삭제할 수 있습니다.

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

9
사용자 지정 매핑이있는 경우 두 번째 옵션은 유형과 매핑을 삭제합니다. 따라서 삭제 후 인덱스 유형을 다시 매핑하는 것을 잊지 마십시오. 그렇지 않으면 엉망이 될 것입니다.
지느러미 모양의 아브라함

24
Ftr : Elasticsearch 2.0에서는 쿼리 별 삭제 API 가 코어에서 제거되었으며 이제 플러그인에 있습니다.
dtk

2
이 방법으로 레코드를 삭제하는 것은 권장되지 않습니다. 문서의 다음 문장 : "동시 인덱싱 중에 OutOfMemoryError를 빠르게 유발할 수있는 새로 고침을 자동으로 강제하기 때문에 문제가 있습니다." elastic.co/guide/en/elasticsearch/reference/1.7/ ...
usef_ksa

3
Ftr : 쿼리 별 삭제 플러그인은 버전 5 부터 ES 코어돌아갑니다 .
Val

11
"No handler found for uri ..."오류가 발생하면 curl -XPOST 'localhost : 9200 / twitter / tweet / _delete_by_query? conflicts = proceed & pretty'-d '{ "query": { "match_all": {}}를 사용합니다. } '
이크발

74

코어에서 새로운 쿼리 별 삭제 API 구현을 위해 Delete-By-Query 플러그인이 제거되었습니다. 여기에서 읽으십시오

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

1
es 5.4에서 나를 위해 일함
jlunavtgrad 2017 년

2
ES 6.1.1에 나를 위해 일한
세바스찬

8
ES 6+의 경우 필요합니다-H 'Content-Type: application/json'
OMRY VOLK

59

ElasticSearch 5.x에서는 기본적으로 delete_by_query API가 있습니다.

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

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

이것은 자식 노드에서 작동하기 때문에 좋습니다 (다른 답변 중 일부는 "
routing_missing_exception

16

John Petrones 답변에서 Torsten Engelbrecht의 의견이 확장되었습니다.

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

(John의 답변은 upvotes를 받고 답변으로 설정되어 있으므로 편집하고 싶지 않았으며 오류가 발생했을 수 있습니다)


1
별도의 플러그인없이 @ChristopheRoussy 아니, 존 Petrone 답변에 대한 의견을 참조
rsilva4

16

다음 쿼리를 사용하여 유형에서 문서를 삭제할 수 있습니다.

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

Kibana 및 Elastic 5.5.2에서이 쿼리를 테스트했습니다.


13

Elasticsearch 2.x부터는 문서가 인덱스에 남아있어 인덱스 손상이 발생하므로 더 이상 삭제할 수 없습니다.


1
그래서 해결책은 무엇입니까?
크리스토프 후씨

1
색인 별칭을 기반으로 한 솔루션을 사용합니다. 주요 아이디어는 매번 새 인덱스를 만들고 news1, news2 and so on현재 활성 인덱스에 대한 별칭을 news경로에 설정하는 것입니다. 물론 색인의 이름은 예시 일뿐입니다. 여기에서 [index alias] ( elastic.co/guide/en/elasticsearch/reference/current/… ) 의 전체 예제 와 사례 연구를 설명하는 기사 를 찾을 수 있습니다 .
Fabio Fumarola 2016-06-18


6

에서 키바 콘솔 :

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'

자세한 내용은 여기에서 찾을 수 있습니다. //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 는 인덱스 이름이고 사용자 는 유형입니다.


5

ES2 +에 대한 참고 사항

ES 1.5.3부터 쿼리 별 삭제 API는 더 이상 사용되지 않으며 ES 2.0부터 완전히 제거되었습니다.

API 대신 쿼리 별 삭제가 이제 플러그인 입니다.

쿼리 별 삭제 플러그인을 사용하려면 클러스터의 모든 노드에 플러그인을 설치해야합니다.

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가 더 이상 유효하지 않기 때문에 선택의 여지가별로 없다고 생각합니다.
데켈

4

(평판이 논평 할만큼 높지 않음) John Petrone의 답변 중 두 번째 부분이 작동합니다. 쿼리가 필요하지 않습니다. 유형과 해당 유형에 포함 된 모든 문서를 삭제하지만 해당 유형에 대해 새 문서를 색인화 할 때마다 다시 만들 수 있습니다.

다시 한번 확인하기 위해: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

참고 : 이렇게 하면 매핑 삭제됩니다! 그러나 앞에서 언급했듯이 새 문서를 만들어 쉽게 다시 매핑 할 수 있습니다.


2
그러나 당신은 당신이 어떤 매핑을위한 특정 구성이있을 때 동적 매핑은, 긴, 등 ... 문자열과 같은 기본 필드를 만들 수 있기 때문에이하지 않는 것이 좋습니다, 당신이 가지고있는 모든 매핑 구성 뭐죠 삭제
카를로스 로드리게스

1
@CarlosRodriguez 그러나 당신이 가진 멋진 매핑은 확실히 소스 제어에 있어야하며 삭제를 수행하는 동일한 스크립트의 일부로 자동으로 다시 적용하기가 매우 쉽습니다.
Jonathan Hartley

이 대답은 "모든 문서 삭제 ... 유형을 삭제하지 않고"라는 질문과 직접적으로 모순됩니다. 프로젝트를 기반으로 매핑을 다시 만드는 것이 얼마나 쉬운 지 가정하지 마십시오. 다른 프로젝트에는 버전 관리 / 마이그레이션 등을 매핑하기위한 더 복잡한 절차가있을 수 있습니다.
VeganHunter

4

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" : [ ]
}


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.