У меня есть проблема, которая похожа на функцию поиска по репозиторию в github, поэтому я буду использовать ее в качестве аналогии.
Я еще не нашел эффективную реализацию, но вот мои предварительные мысли:
- Существует тип документа Elasticsearch
EsRepo
, представляющий репо с полями, такими как title / description / star_count и т. Д. - Можно легко искать / фильтровать поля title / description / star_count во всех
EsRepo
. - Репо могут быть отмечены тысячами или даже миллионами пользователей.
Метод ONE
Присоедините свойство starred_by_user_ids
(массив идентификаторов пользователей) к типу EsRepo
doc.Только так я могу отфильтровать помеченные репо по определенному пользователю.
Но этот метод выглядит глупо, в этом массиве могут содержаться миллионы идентификаторов.Кроме того, я не думаю, что репо должно помнить, кто его сыграл.
Метод ДВА
При поиске запросите базу данных, чтобы получить все идентификаторы помеченного репо пользователя и передать всеэти идентификаторы в предложении фильтра запросаasticsearch.
Здесь предполагается, что у пользователя не будет много помеченных проектов (не более нескольких сотен или тысяч, но это предположение может быть очень слабым).
Метод THREE
Поддерживать дублированный тип документа с именем EsStarredRepo
для каждого действия звезды с полями title / description / star_count, синхронизированными с EsRepo
, но будет много избыточности, и эти поля будут синхронизированыпочти невозможно.
Я еще не обнаружил других подходов.И ни один из трех описанных выше способов не кажется мне достаточно хорошим.Если мне нужно выбрать один, метод ДВА может быть лучшим из трех.Но мне все равно любопытно, думаю ли я в правильном направлении или пропустил гораздо лучшую идею.
Спасибо за любые предложения.