Akuma
@Akuma
Веб-программист

Как вывести несколько товаров из разных категорий на Elasticsearch?

Привет,

есть интернет-магазин с ~1000 поставщиков. У каждого может быть от 100 до 10000 товаров.
Поиск на сайте делаю через Elasticsearch 5.1.1. Индексы примерно следующие:

suppliers:
- title

goods:
- supplier_id
- title

Подключил русскую морфологию, все работает шикарно. Но проблема в том, что из-за обилия товаров у каждого поставщика, один поставщик в результатах выдачи может занимать несколько первых страниц.

Учитывая, что дальше первой страницы вообще мало кто ходит, получается, что конкретные поставщики получают преимущество. Хотелось бы этого избежать.

Я могу сделать случайную сортировку, основанную на сесии, но релевантность из-за этого сбивается и по запросу "детская одежда" в конец могут уйти детские товары, а вверх поднимется просто одежда.

В идеале я хочу сделать чередование поставщиков в выдаче с сохранением релевантности.

Сейчас:
- Товар из поставщика 1
- Товар из поставщика 1
- Товар из поставщика 1
- Товар из поставщика 1
- Товар из поставщика 2
- Товар из поставщика 2
- Товар из поставщика 2
- Товар из поставщика 2

А нужно:
- Товар из поставщика 1
- Товар из поставщика 2
- Товар из поставщика 1
- Товар из поставщика 2
- Товар из поставщика 3
- Товар из поставщика 4
....

Можно получить полностью результат поиска и рассортировать его на PHP, но это как-то по варварски. Уверен, что должны быть способы сделать это через эластик. Может кто-то сталкивался и подскажет?
  • Вопрос задан
  • 454 просмотра
Решения вопроса 1
Kotofey
@Kotofey
Вам должны подойти аггрегированные запросы типа "Top hits Aggregation".
Смысл в том, что вы в таком запросе указываете поле, по которому нужно сгруппировать данные (в вашем случае поле поставщика) и можно задать кол-во документов для каждой такой группировки, напр. 2-3 (будет зависеть от кол-во выводимых вами результатов на странице).
В результате такого запроса вы получите топовые 2-3 результата по каждому поставщику и уже методами PHP можно рандомно их перемешать и выдать пользователю.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
При заливке данных ввести поле rnd, с рандомным числом от 0 до 100
Если заливаете через bulk, то можно использовать script
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы