2014-06-16 2 views
1

Я работаю над простым побочным проектом и имею технический стек, который включает в себя как базу данных 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, пока я не смогу придумать лучший способ структурировать это.

ответ

3

Поиск elasticsearch не поддерживает возврат каждого документа к вашим запросам. Потому что L1 перегружает систему. Вместо этого .. Использование концепции прокрутки в elasticsearch .. Это Лик концепции курсора в децибелах ..

http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/scan-scroll.html

Более примеры относятся репо GitHub. https://github.com/sidharthancr/elasticsearch-java-client

Надеется, что это помогает ..

0

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-fields.html

, пожалуйста, посмотри в упругий поиске документ, в котором можно указать только определенные поля, которые возвращаются из спичечных документов

надеюсь, что это решает проблему

{ 
    "fields" : ["user", "postDate"], 
    "query" : { 
     "term" : { "user" : "kimchy" } 
    } 
} 
Смежные вопросы