Я работаю над простым побочным проектом и имею технический стек, который включает в себя как базу данных SQL, так и ElasticSearch. У меня только ElasticSearch, потому что я предполагал, что по мере роста моего проекта мой полный поиск текста будет наиболее эффективно выполняться ES. Моя схема ES очень проста - документы, которые я вставляю в ES, имеют 2 поля, один из которых является идентификатором, а другой - полем с текстом для поиска. Идентификатор, вставленный в ES, соответствует идентификатору первичного ключа этого документа из базы данных SQL.Как получить все идентификаторы документов, соответствующие поиску, в поиске эластичности?
insert record into SQL -> insert record into ES using PK from SQL
Поиск будет обратным. Запросите ES и возьмите все соответствующие идентификаторы, а затем развернитесь и используйте эти идентификаторы для получения записей из SQL.
search ES can get all PK ids -> use those ids to get documents from SQL
Проблема, с которой я столкнулась, заключается в том, что ES может возвращать документы только в разбивке по страницам. Это проблема, потому что у меня также есть предложение WHERE
в моем SQL-запросе, помимо только идентификаторов. Мой SQL запрос может выглядеть следующим образом ...
SELECT * FROM foo WHERE id IN (1,2,3,4,5) AND bar != 'baz'
Ну, с ES постраничного результаты, моя статья WHERE
всегда будет только запрашивая подмножество полных результатов ES. Даже если я использую ES 'skip
и take
, я все еще только запрашиваю SQL, используя подмножество идентификаторов документов.
Есть ли способ получить Elastic Search, чтобы возвращать весь список подходящих идентификаторов документов? Я понимаю, что это здесь, чтобы не позволить мне стрелять в ногу, потому что делать это через все осколки и многие документы неэффективно. Разве это не так?
После нескольких часов работы над этим проектом я только теперь понял, что я плохо разработал это, если только я не смогу получить все эти идентификаторы от ES. Некоторые альтернативные реализации, которые, как я думал, будут хранить то, что я фильтрую, в SQL, также в ES. Проблема в том, что мне придется обновлять документ ES каждый раз, когда я обновляю документ в SQL. Это потребует довольно большой перезаписи некоторых из моего кода доступа к данным. Я мог бы обмануть ElasticSearch все вместе и просто выполнить поиск в Postgres, пока я не смогу придумать лучший способ структурировать это.