如何使用太阳黑子进行多值场的订购?

时间:2014-03-06 15:22:31

标签: ruby-on-rails solr sunspot sunspot-rails

我是使用太阳黑子/ solr的新手,并且在一个更大的项目中偶然发现了一个问题,它已经以相当沉重的方式使用了。我需要做的是找到一种方法来根据它是否在多值字段中具有值来对结果的分数进行排序/提升。为了使其更清晰,我假设我有以下设置:

searchable do
  integer user_ids
  integer unread_by_user_ids
end

我想得到一个给定用户的所有文档的列表,其结果是用户是否已经阅读过该文档。另外我需要提一下我将结果分页,所以在solr搜索之后对它们进行排序是不可能的。我已经尝试过类似这里的类似问题:Rails Sunsport/Solr: Ordering on multiple-value field,但由于没有实际的答案,我以为我会试着发布一个新答案。根据我一直在阅读的内容,在我看来,没有方法可以做到这一点,最好的做法是做2个查询,一个用于未读项目,一个用于完成一页结果所需的读取项目如果需要,可以连接结果。不过,我想确保没有更好的方法来做到这一点。任何帮助/建议表示赞赏。

1 个答案:

答案 0 :(得分: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

如果您想知道插值字符串作为键的含义以及为什么我没有直接使用用户ID作为键,可以在此处找到答案:Indexing and ordering by dynamic field with sunspot

如果这种方法出现问题,欢迎提出任何意见。