2015-07-09 8 views
0

У меня есть 20 000 000 позиций в Elasticsearch, которые я счастливо ищу (он работает потрясающе хорошо).Elasticsearch - эквивалент LEFT JOIN

Существует дополнительный аспект, хотя я не знаю, как решить:

Пользователь может «купить» эти предметы (в партиях от 1000 до 100000), и мне нужен мой поиск, чтобы вернуть только элементы что они еще не «купили». Я бы решил это с помощью LEFT JOIN в SQL.

Я мог бы добавить к каждому элементу поля buyBy [], но тогда мне нужно будет обновлять множество документов каждый раз, когда пользователь покупает. Чувствует себя неправильно?

+0

И как 'они ранее не«купили»' определен в кластере? –

+0

«купленный» еще не определен - это своего рода вопрос, но по существу это всего лишь набор идентификаторов. buyBy [] может быть набором идентификаторов пользователей. – Kong

ответ

2

Elasticsearch использует Lucene, который поддерживает blockjoin. В Elasticsearch - Parent-Child Relationships. Это дает вам соединение, но оно также имеет ограничения (уже невозможно произвольно распространять документы по узлам, требования к памяти могут взорваться в определенных сценариях).

В документации Elasticsearch вы найдете a nice overview of the relationship modelling options.

Если вам нужны глубокие объединения, более сложные отношения и т. Д., Вы можете рассмотреть возможность поиска в SIREn plugin.

(отказ от ответственности: я работаю в компании, которая разрабатывает сирену)