удалить все элементы, которые меньше значения в Elasticsearch

У меня есть следующие сохраненные данные json в Elasticsearch:

   {
   "id":"1234",
   "expirationDate":"17343234234",
   "paths":"http:localhost:9090",
   "work":"software dev",
   "family":{
      "baba":"jams",
      "mother":"ela"
   }
},
{
   "id":"00021",
   "expirationDate":"0123234",
   "paths":"http:localhost:8080",
   "work":"software engi",
   "family":{
      "baba":"stev",
      "mother":"hela"
   }
}

я хочу удалить весь список id, у которого его expirationDate меньше, чем сегодня, используя QueryBuilder в springdata Elasticsearch


person Catalina    schedule 22.10.2020    source источник
comment
Сколько идентификаторов в результатах вы ожидаете примерно?   -  person Val    schedule 22.10.2020
comment
Я хочу получить все идентификаторы   -  person Catalina    schedule 22.10.2020
comment
мой вопрос сколько стоит все? 10, 100, 1000, 10000, 1М? решение зависит от этого ответа   -  person Val    schedule 22.10.2020
comment
Более 10000   -  person Catalina    schedule 22.10.2020
comment
Хорошо, тогда вы не сможете получить их всех одним выстрелом, это нормально для вас?   -  person Val    schedule 22.10.2020
comment
Да, но в чем причина этого?   -  person Catalina    schedule 22.10.2020
comment
И мне просто любопытно насчет условия... все предметы, созданные до сегодняшнего дня, в значительной степени означают все предметы, верно? так как в будущем не создаются предметы... или они есть?   -  person Val    schedule 22.10.2020
comment
Именно то, что я хочу получить   -  person Catalina    schedule 22.10.2020
comment
Причина в том, что по умолчанию ES возвращает только 10 000 обращений. Вы можете снять это ограничение, но это может повлиять на производительность... Было бы полезно узнать ваш вариант использования более подробно.   -  person Val    schedule 22.10.2020
comment
Хорошо, какое лучшее решение для этого, пожалуйста, я хочу получить все старые объекты, значит, до сегодняшнего дня   -  person Catalina    schedule 22.10.2020
comment
Ну, не все предметы, более подробно, срок годности должен быть на 3 дня раньше, но я запутался на этом небольшом примере только для демонстрации.   -  person Catalina    schedule 22.10.2020
comment
Пожалуйста, посмотрите обновленный пост, я имею в виду expireDate   -  person Catalina    schedule 22.10.2020
comment
Потому что, если я проверю, истек ли срок действия до сегодняшнего дня, срок действия элемента истек   -  person Catalina    schedule 22.10.2020
comment
Давайте продолжим обсуждение в чате.   -  person Catalina    schedule 22.10.2020
comment
Вот решение, которое вам подойдет: stackoverflow.com/a/37669582/4604579, может потребоваться некоторая адаптация с учетом это было для более старой версии, но там объясняется концепция, то есть поиск с прокруткой.   -  person Val    schedule 22.10.2020
comment
Не могли бы вы адаптировать решение с помощью elastcsearch 7.6, который я использую, буду очень благодарен   -  person Catalina    schedule 22.10.2020


Ответы (1)


Итак, удалить по запросу это путь.

POST /{your_index_name}/_delete_by_query
{
  "query": {
    "range": {
      "expirationDate": {
        "lt": "{your_timestamp}"
      }
    }
  } 
}

документация клиента Java указывает, что вы можете создать запрос таким образом:

BulkByScrollResponse response =
  new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE)
    .filter(QueryBuilders.matchQuery("gender", "male")) 
    .source("persons")                                  
    .get();                                             
long deleted = response.getDeleted();

Это помечено как поддерживается Spring-data-elasticsearch начиная с версии 3.2.

Например, вы можете использовать вывод запроса< /а> :

В дополнение к методам запросов доступны производные запросы как для запросов на подсчет, так и для запросов на удаление.

В Приложении C вы можете видеть, что IsLessThan — это ключевое слово деривации запроса, что означает, что что-то в этом роде должно поддерживаться «из коробки»:

interface YourRepository extends CrudRepository<User, Long> {
  long deleteByExpirationDateIsLessThan(long timestamp);
}

Используя деривацию запросов, вы позволяете Spring выполнять реализацию (скрестим пальцы, чтобы все было правильно).

Но вы также можете использовать ElasticsearchRestTemplate#delete (если вы используете старую версию ElasticsearchTemplate, это работает так же).

Это позволяет вам передавать любой запрос Spring-данных (собственный, строковый или критерий).

person GPI    schedule 06.11.2020
comment
но как создать функцию, поддерживающую этот запрос, используя QueryBuilder или аналогичный API? Или DeleteRequestBuilder в springboot - person Catalina; 06.11.2020
comment
Я добавил детали, но на самом деле это просто стандартные данные Spring / Spring es. - person GPI; 06.11.2020
comment
у меня есть последний вопрос, пожалуйста, есть ли способ обновить все expireDate до текущего времени? так expiratonDate меньше текущего времени, чем обновление до сегодняшнего времени, пожалуйста, помогите мне - person Catalina; 09.11.2020
comment
Так и есть, но elasticsearch вообще не оптимизирован для этого, поэтому это чрезвычайно дорого (в основном это влечет за собой перестройку всего индекса). Но это совсем другой вопрос, поэтому, пожалуйста, задайте его в отдельном вопросе. - person GPI; 09.11.2020
comment
пожалуйста, помогите мне: stackoverflow.com/questions/64771780/ - person Catalina; 10.11.2020