如何按文档类型提升Solr搜索结果?

时间:2015-12-18 18:42:17

标签: ruby-on-rails solr sunspot websolr

注意:我正在使用带有Rails的Sunspot,但如果您不熟悉太阳黑子的DSL,那么通用的Solr响应仍然可以指导我朝着正确的方向发展。

我有几个类似的模型:

class Book < ActiveRecord::Base
  searchable do
    text :title, boost: 2.0
    text :content
  end
end

class Article < ActiveRecord::Base
  searchable do
    text :title, boost: 2.0
    text :content
  end
end

我需要同时在所有模型中进行全文搜索,以获得混合结果,但文章应该被认为比搜索结果中的书更有意义。

我目前执行搜索的代码如下。

search = Sunspot.search do
  fulltext search_terms, minimum_match: 1
end

这正确地返回了混合结果,但与Book结果相比,我需要提高文章结果。我想清楚这与首先列出所有文章结果然后列出所有书籍结果不同。根据Solr如何根据整体内容对结果进行排名,仍然可能存在一些混合。

我猜测我需要使用一些提升功能,但无法弄清楚具体如何。

任何指针?

1 个答案:

答案 0 :(得分:1)

太阳黑子通常会尝试将这些事物作为&#34;搜索&#34;块。检查Sunspot docs会显示此信息......

# Posts with pizza, scored higher if featured
Post.search do
  fulltext 'pizza' do
    boost(2.0) { with(:featured, true) }
  end
end

那来自https://sunspot.github.io/docs/#Search_In_Depth

因为Sunspot将模型名称索引到&#34;类型&#34;我认为你可以这样调整:

boost(10.0) { with(:type, "Article") }

唉。如果您尝试这样做,您将收到如下错误:

Sunspot::UnrecognizedFieldError: No field configured for Article, Book with name 'type'

那是因为在这种情况下当前版本的太阳黑子的DSL引用了searchable块中定义的字段,而type字段是一种特殊情况。也许是在那里为太阳黑子作出贡献的好机会?

知道这一点,我们有一个可能的解决方法,那就是在文档中定义我们自己的自定义类型相关字段。也许称它为source以避免破坏特殊的套接字默认值,尽管测试可能表明这不是什么大问题。

引导我进入最后的代码示例(未经测试,ymmv等!)

class Article < ActiveRecord::Base
  searchable do
    text :title, boost: 2.0
    text :content
    string :source do
      class.name
    end
  end
end

Sunspot.search(Article, Book) do
  fulltext(search_terms) do
    minimum_match 1
    boost(ARTICLE_BOOST) { where(source, "Article") }
  end
end
相关问题