[英]How to boost Solr search results by document type?
注意:我将Sunspot与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结果相比,我需要提高Article结果。 我想清楚一点,这与首先列出所有Article结果,然后列出所有Book结果是不同的。 根据Solr如何根据结果的整体内容对结果进行排名,仍然可能会有一些混淆。
我猜我将需要使用一些增强功能,但不能确切地知道如何。
有指针吗?
太阳黑子通常试图将这些东西作为“搜索”块中的函数公开。 检查Sunspot文档显示此信息...
# 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将模型名称索引到“类型”字段中,所以我认为您可以这样进行调整:
boost(10.0) { with(:type, "Article") }
唉。 如果您尝试这样做,将会得到如下错误:
Sunspot::UnrecognizedFieldError: No field configured for Article, Book with name 'type'
这是因为在这种情况下,当前版本的Sunspot DSL引用的字段是在searchable
块中定义的,而type
字段是一种特殊情况。 也许是在那里为Sunspot做出贡献的好机会?
知道这一点,我们有一个可能的解决方法,那就是在您的文档中定义我们自己的与类型相关的自定义字段。 也许称其为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.