# Как удалить много записей из elasticsearch?

**URL:** <https://discuss.elastic.co/t/elasticsearch/71513>\
**Category:** Вопросы на русском языке\
**Created:** [January 13, 2017, 11:08am UTC](https://discuss.elastic.co/t/elasticsearch/71513 "2017-01-13T11:08:07Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![IlyaT](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ilyat/32/14548_2.png) [@IlyaT](https://discuss.elastic.co/u/IlyaT)\
**Post date:** [January 13, 2017, 11:08am UTC](https://discuss.elastic.co/t/elasticsearch/71513/1 "2017-01-13T11:08:07Z")

</div>

Дано, база на сотни миллионов записей вида:  
ID, FILE\_ID, SITE\_ID  
надо оптимальным образом удалить десятки тысяч записей для которых мы знаем FILE\_ID, а SITE\_ID в пределах одного запроса - одинаковый.  
ID - уникальны (но мы их изначально не знаем)  
FILE\_ID - уникальны для каждого сайта  
Т.е. на SQL это выглядело бы примерно так  
delete from table where (FILE\_ID=x or FILE\_ID=y or ....) and (SITE\_ID=z)

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [January 13, 2017, 3:28pm UTC](https://discuss.elastic.co/t/elasticsearch/71513/2 "2017-01-13T15:28:23Z")

</div>

Версия elasticsearch?

---

<div class="post-metadata">

**Author:** ![IlyaT](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ilyat/32/14548_2.png) [@IlyaT](https://discuss.elastic.co/u/IlyaT)\
**Post date:** [January 14, 2017, 8:22am UTC](https://discuss.elastic.co/t/elasticsearch/71513/3 "2017-01-14T08:22:20Z")

</div>

5.1.1

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [January 14, 2017, 2:36pm UTC](https://discuss.elastic.co/t/elasticsearch/71513/4 "2017-01-14T14:36:38Z")

</div>

Тогда можно воспользоваться [Delete By Query API](https://www.elastic.co/guide/en/elasticsearch/reference/5.1/docs-delete-by-query.html). Я бы зачал с 1000 FILE\_ID в одном [terms query](https://www.elastic.co/guide/en/elasticsearch/reference/5.1/query-dsl-terms-query.html) запросе а потом поэкпериментировал бы с увеличением/уменьшением кольчества FILE\_ID в одном запросе.

---

<div class="post-metadata">

**Author:** ![IlyaT](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ilyat/32/14548_2.png) [@IlyaT](https://discuss.elastic.co/u/IlyaT)\
**Post date:** [January 14, 2017, 5:50pm UTC](https://discuss.elastic.co/t/elasticsearch/71513/5 "2017-01-14T17:50:25Z")

</div>

А в нем можно задать условие по нескольким полям? Вот так не получается:

> ```
> GET _search
> {
> "query": { 
> "terms": {
> "site_id": ["x"], 
> "file_id": [
> "y",
> "z"
> ]
> } }
> }
> 
> ```

---

<div class="post-metadata">

**Author:** ![IlyaT](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ilyat/32/14548_2.png) [@IlyaT](https://discuss.elastic.co/u/IlyaT)\
**Post date:** [January 14, 2017, 6:15pm UTC](https://discuss.elastic.co/t/elasticsearch/71513/6 "2017-01-14T18:15:56Z")

</div>

Использовал post\_filter  
вроде бы получилось, но возможно это не лучшее решение.

```
           "query": { 
           "terms": {
             "file_id": [
               "x",
               "y"
             ]
           } },
           "post_filter": {"term": {
             "site_id": "z"
           }}                            
       }
```

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [January 16, 2017, 12:16pm UTC](https://discuss.elastic.co/t/elasticsearch/71513/7 "2017-01-16T12:16:07Z")

</div>

Лучше использовать [`bool`](https://www.elastic.co/guide/en/elasticsearch/reference/5.1/query-dsl-bool-query.html) в данном случае. С `post_filter` работать будет, но он, обычно, работает медленнее и используется, в основном, при агрегировании, когда нужно выдавать данные по одному поиску, а агрегировать по другому.

---

<div class="post-metadata">

**Author:** ![IlyaT](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ilyat/32/14548_2.png) [@IlyaT](https://discuss.elastic.co/u/IlyaT)\
**Post date:** [January 16, 2017, 12:29pm UTC](https://discuss.elastic.co/t/elasticsearch/71513/8 "2017-01-16T12:29:17Z")

</div>

Большое спасибо!

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [February 13, 2017, 12:29pm UTC](https://discuss.elastic.co/t/elasticsearch/71513/9 "2017-02-13T12:29:22Z")

</div>

Closed on February 13, 2017, 12:29pm UTC

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
