Передача в определенном порядке возврата для запроса AWS Cloudsearch

Есть ли способ сообщить запросу cloudsearch, что я хочу получить совпадающие результаты в определенном порядке?

У меня есть облачный поиск, заполненный продуктами. Для каждого пользователя у меня есть предопределенный порядок, в котором я хочу, чтобы эти продукты отображались. Пользователь может фильтровать продукты по ряду полей, и это вызовет Cloudsearch и вернет совпадения, по 10 за раз (загруженные результаты ajax).

Как я могу сообщить Cloudsearch, что после того, как он найдет эти совпадения, я хочу, чтобы они были возвращены в заранее определенном порядке для этого конкретного клиента?


person northernMonkey    schedule 30.07.2015    source источник
comment
Планируете ли вы индексировать заказ для каждого пользователя в CloudSearch? Сколько пользователей вы планируете иметь? Существует ли фиксированное количество схем заказа? Каким-то образом CloudSearch нужно будет знать, каков порядок, если он собирается сортировать результаты для вас. Можно ли получить ранг на основе других свойств документов? Если это так, просто используйте ранговое выражение docs.aws.amazon.com /cloudsearch/latest/developerguide/ ; в противном случае вам нужно будет его проиндексировать, но я не могу дать больше советов, чем это, не зная больше о ваших требованиях.   -  person alexroussos    schedule 31.07.2015
comment
У меня было бы более 100 000 пользователей, и у каждого из них был бы свой индивидуальный заказ, так что это означало бы добавление нового индекса для каждого отдельного клиента в CloudSearch, что на самом деле невозможно, не так ли? 100 тыс. столбцов в объекте поиска? Ранжирование основано на стороннем алгоритме и хранится в таблице локально в нашей базе данных. Таким образом, мы могли бы отправить порядок идентификаторов в нашем поисковом запросе, если бы был способ указать CloudSearch использовать этот порядок своих результатов.   -  person northernMonkey    schedule 31.07.2015


Ответы (1)


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

Лучшее, что я могу придумать, это что-то вроде получения всех результатов запроса, а затем их сортировки на основе рейтинга в вашей БД. CloudSearch довольно быстр, и вы должны иметь возможность запрашивать наборы результатов из нескольких тысяч (в моем индексе из 40 тысяч документов возврат набора из 1000 результатов занял ~ 400 мс). Затем вам придется отсортировать их в соответствии с их рангом в вашем хранилище данных. Это кажется очень расточительным, но это может быть лучшее, что вы можете сделать с ограничениями, в которых вы работаете.

Или вы можете получить первые n элементов для этого пользователя из своей базы данных и обратиться к CloudSearch с запросом пользователя, проверив эти первые n элементов в результатах (на самом деле это может быть частью запроса) и просматривайте результаты поиска, пока не найдете достаточно (10 в вашем случае), чтобы отобразить их пользователю.

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

person alexroussos    schedule 31.07.2015
comment
Ценю ваши комментарии, и я уже застрял на этом пути, надеясь вопреки всему, что есть какое-то волшебное решение, о котором я не знал. - person northernMonkey; 31.07.2015
comment
Нет проблем. Жаль, что нет серебряной пули для этого. Желаю тебе удачи! - person alexroussos; 31.07.2015