1

注意:我正在使用带有 Rails 的Sunspot,但如果您不熟悉 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 结果。我想明确一点,这与首先列出所有文章结果然后列出所有书籍结果不同。根据 Solr 如何根据整体内容对结果进行排名,仍然可能会有一些组合。

我猜我需要使用一些增强功能,但不知道具体如何。

任何指针?

4

1 回答 1

2

Sunspot 通常会尝试将这些类型的东西作为“搜索”块中的函数公开。​查看太阳黑子文档显示了这一点……</p>

# 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 ​</p>

因为 Sunspot 将模型名称索引到“类型”字段中,我认为您可以这样调整:

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

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

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

这是因为在这种情况下,当前版本的 Sunspot 的 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
于 2015-12-18T21:57:51.430 回答