注意:我正在使用带有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如何根据整体内容对结果进行排名,仍然可能存在一些混合。
我猜测我需要使用一些提升功能,但无法弄清楚具体如何。
任何指针?
答案 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