Как упорядочить по многозначному полю, используя солнечное пятно?

Я новичок в использовании sunspot/solr и наткнулся на проблему в более крупном проекте, где он уже используется довольно интенсивно. Что мне нужно сделать, так это найти способ отсортировать/повысить оценку результата в зависимости от того, имеет ли он значение в многозначном поле. Чтобы было понятнее, предположим, что у меня есть следующие настройки:

searchable do
  integer user_ids
  integer unread_by_user_ids
end

Я хочу получить список всех документов для данного пользователя с упорядочением результатов в зависимости от того, прочитал ли пользователь уже документ или нет. Также я должен упомянуть, что я листаю результаты, поэтому упорядочить их после поиска solr не может быть и речи. Я пробовал рассматривать похожие вопросы, подобные приведенному здесь: Rails Sunsport/ Solr: Заказ по полю с несколькими значениями , но, поскольку фактических ответов нет, я решил попытать счастья, опубликовав новый. Из того, что я читал, мне кажется, что для этого нет способа, и лучшим способом действий было бы выполнить 2 запроса: один для непрочитанных элементов и один для прочитанных элементов, необходимых для заполнения страницы результатов. если они необходимы, и объединить результаты. Тем не менее, я хотел сначала убедиться, что нет лучшего способа сделать это. Любая помощь/совет приветствуется.


person Cristian Badila    schedule 06.03.2014    source источник


Ответы (1)


Наконец-то я решил эту проблему, используя динамические поля. Вот как выглядит объявление с возможностью поиска:

searchable do
  integer user_ids
  dynamic_boolean :document_read_status do
    user_ids = get_all_user_ids
    unread_user_ids = get_all_unread_user_ids
    user_ids.inject({}) do |hash, user_id|
      hash.merge(:"unread_by_#{user_id}" => unread_user_ids.include?(user_id))
    end
  end
end

и фактический поиск выглядит так:

search.build do
  with(:user_ids, user.id)
  dynamic :document_read_status do
    order_by(:"unread_by_#{user.id}", :desc)
  end
end

Если вам интересно, что с интерполированной строкой в ​​качестве ключа и почему я не использовал идентификатор пользователя в качестве ключа напрямую, этот ответ можно найти здесь: Индексирование и упорядочение по динамическому полю с солнечным пятном

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

person Cristian Badila    schedule 07.03.2014