Моделирование данных с упругим поиском
У нас есть сложная модель предметной области, которую мне нужно смоделировать в упругом виде, и я не могу найти лучший способ сделать это. У нас есть упрощенная модель предметной области:
- Ресторан
- Ресторан (в одном месте) - содержит адрес и GPS-координаты.
- Пункт меню - предлагается цепочкой, но он может быть подан не во всех точках этой цепочки.
Типичный запрос по индексу: "Найди мне все" шоколадные пирожные "в радиусе 1 мили от моего текущего местоположения, отсортируйте по релевантности, но не показывайте мне дубликаты в той же цепочке, расстоянии и адресе ближайшего местоположения". для этой цепочки достаточно хорошо ". Запрос также должен поддерживать разбиение на страницы (показать мне первые 10 результатов, следующие 10 и т. д.)
Что было бы идеальным отображением для такой модели?
В настоящее время я вижу два варианта:
хранить по одному документу на предмет в цепочке. Если у цепи X есть "шоколадный торт", у нас будет только один документ. Этот документ будет содержать массив всех местоположений, которые несут этот элемент. Фильтр расстояния в упругом элементе, похоже, может обрабатывать массив координат GPS, но как только я получу результат от упругого элемента, мне все равно нужно вручную выполнить итерацию по всем вложенным записям ресторана, снова рассчитать расстояние и найти ближайший, чтобы представить правильное расстояние до предмета. Плюсы: это работает. Минусы: массив вложенных ресторанных записей в документе элемента может потенциально стать большим (десятки тысяч местоположений в цепочке), поэтому, во-первых, я не уверен, насколько эластичным будет обрабатывать это и второе, итерация по этому массиву O(n) для расчета расстояния видится ненужная нагрузка на мой сервер для каждого запроса, которого можно избежать.
хранить по одному документу на единицу товара в каждом месте (если в цепи X 100 мест и все они подают этот шоколадный торт, у нас в системе будет 100 похожих документов для "шоколадного пирога в цепи X", каждый из которых будет отличаться от другого только адресом и GPS координаты. Плюсы: документы небольшие, и нам не нужно вручную перебирать внутренний массив местоположений. Минусы: у нас проблема с дубликатами, более чем один документ "шоколадный торт в цепочке X" может пройти фильтр расстояния, и мы каким-то образом Нужно вручную отфильтровать эти дубликаты после того, как мы получим результаты из эластичного. Добавьте пагинацию в смесь, и это станет нетривиальным.
Есть ли другой вариант для более эффективного моделирования? Есть ли способ настроить #1 или #2, чтобы убрать минусы, которые у них есть?
Спасибо Дмитрий