У меня есть эта странная ошибка с упругим поиском, возвращающая попадание в запись, которая должна быть (и, кажется, удалена).
Вот моя структура приложения:
- Rails Api, использующий Searchkick для управления индексами ES
- ES версия 5.6
- Angular веб-приложение, которое запрашивает ES напрямую
Обычный вариант использования заключается в том, что все управление индексами выполняется с помощью searchkick, но приложение внешнего интерфейса отправляет запросы непосредственно на сервер ES, а не через интерфейс searchkick (API-интерфейсы rails обслуживают многие другие веб-приложения).
Я запускаю сценарий, который удаляет запись из моей базы данных, которая должна асинхронно c соответствовать моему индексу ES. Например, если я удаляю запись с id = 12345, то при выполнении MyModel.search 12345 searchkick не может вернуть эту запись, поскольку ее больше нет в индексе.
Однако во внешнем приложении, когда я запросите индекс ES напрямую, он действительно возвращает запись! Вот пример используемого мной запроса ES, который возвращает ровно 1 попадание (удаленную запись). Следует также отметить, что это происходит не всегда, а иногда всплывает, оставляя записи о призраках.
{"query":{"bool":{"must":[{"match":{"id":"12345"}},{"nested":{"path":"nested_object","inner_hits":{"size":100},"query":{"bool":{}}}}],"should":[]}},"size":30,"from":0,"sort":["_score",{"updated_at":"asc"}]}
Кто-нибудь знает, почему мой запрос searchkick и прямой запрос ES не согласны по этому поводу? удаленная запись?