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


(Илья Толстенко) #1

Дано, база на сотни миллионов записей вида:
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)


(Igor Motov) #2

Версия elasticsearch?


(Илья Толстенко) #3

5.1.1


(Igor Motov) #4

Тогда можно воспользоваться Delete By Query API. Я бы зачал с 1000 FILE_ID в одном terms query запросе а потом поэкпериментировал бы с увеличением/уменьшением кольчества FILE_ID в одном запросе.


(Илья Толстенко) #5

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

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

(Илья Толстенко) #6

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

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

(Igor Motov) #7

Лучше использовать bool в данном случае. С post_filter работать будет, но он, обычно, работает медленнее и используется, в основном, при агрегировании, когда нужно выдавать данные по одному поиску, а агрегировать по другому.


(Илья Толстенко) #8

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


(system) #9

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