Дано, база на сотни миллионов записей вида:
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)
Версия elasticsearch?
5.1.1
Тогда можно воспользоваться Delete By Query API. Я бы зачал с 1000 FILE_ID в одном terms query запросе а потом поэкпериментировал бы с увеличением/уменьшением кольчества FILE_ID в одном запросе.
А в нем можно задать условие по нескольким полям? Вот так не получается:
GET _search { "query": { "terms": { "site_id": ["x"], "file_id": [ "y", "z" ] } } }
Использовал post_filter
вроде бы получилось, но возможно это не лучшее решение.
"query": {
"terms": {
"file_id": [
"x",
"y"
]
} },
"post_filter": {"term": {
"site_id": "z"
}}
}
Лучше использовать bool
в данном случае. С post_filter
работать будет, но он, обычно, работает медленнее и используется, в основном, при агрегировании, когда нужно выдавать данные по одному поиску, а агрегировать по другому.
Большое спасибо!
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.