思考Sphinx:sort_mode => :time_segments或:sort_mode => :expr with @ weight * created_at?

时间:2013-04-05 15:51:32

标签: ruby-on-rails sphinx thinking-sphinx

我正在研究狮身人面像和思考 - 狮身人面像,我需要你的意见和帮助,我想做的是以下几点:

我有一个新闻列表(noticias),我想按日期和相关性排序结果,因为如果我在创建新闻时搜索某些内容无关紧要,则不会考虑查询。如果我至少可以指定更接近的年份或年份和月份具有更多相关性,那么我的问题应该已经解决了。

我看到很多事情,但没有太多结论,也许是因为我对狮身人面像和思维 - 狮身人面像的低经验。

怎样才能解决这个问题?您认为最好的方式是什么?感谢。

我的模特:

define_index do
  indexes :titulo
  indexes :chamada
  indexes :texto
  indexes :description
  indexes :keywords
  indexes :otimizador_de_busca
  indexes :created_at, :sortable => true
  indexes tags.nome, :as => :tag
  indexes usuario.nome, :as => :autor
  where "validacao = '1'"
end

我在控制器上的搜索功能:

termo = params[:termo].first(50)
@noticias = Noticia.search termo,
:field_weights => {:tag => 150, :autor => 120, :titulo => 100, :chamada => 80, :otimizador_de_busca => 65, :description => 50, :keywords => 50, :texto => 10},
:match_mode => :all,
:page => params[:pagina],
:sort_mode => :extended,
:order => "@relevance DESC, created_at DESC",
:per_page => 15

1 个答案:

答案 0 :(得分:2)

有几点需要注意。首先,字段和属性与Sphinx之间存在差异,将created_at作为一个字段并没有太大的好处,但它作为一个属性(可以原生排序)更有用。那么,让我们更新索引定义:

define_index do
  indexes :titulo
  indexes :chamada
  indexes :texto
  indexes :description
  indexes :keywords
  indexes :otimizador_de_busca
  indexes tags.nome, :as => :tag
  indexes usuario.nome, :as => :autor

  has :created_at

  where "validacao = '1'"
end

然后运行rake ts:rebuild,以便更改反映在您的索引文件中,并且Sphinx守护程序也可以识别它。

至于你如何排序...你有几个选择。在您的示例中,您主要按相关性进行排序,但任何具有匹配相关性分数的内容都会先列出较新的项目。我认为这样做会很好。

如果你想使用Sphinx的time_segments排序,那么它也可以运作良好,因为它会根据年龄对结果进行分组(不过于具体),然后根据相关性自动在每个年龄组中进行排序:

termo = params[:termo].first(50)
@noticias = Noticia.search termo,
  :field_weights => {:tag => 150, :autor => 120, :titulo => 100, :chamada => 80, :otimizador_de_busca => 65, :description => 50, :keywords => 50, :texto => 10},
  :match_mode    => :extended,
  :page          => params[:pagina],
  :sort_mode     => :time_segments,
  :order         => :created_at,
  :per_page      => 15

我也将匹配模式更改为扩展,我通常建议。

最后,正如您所建议的那样,您可以将created_at时间戳与表达式中的相关性进行分解 - 这取决于您。可能有一些公式可以帮助解决这个问题,但我认为这可能是你不需要的额外复杂性。

如果您认为首先获得较新的结果更为重要,那么请使用时间段。如果您认为首先在搜索查询中获得相关结果更为重要,请在您自己的示例中使用扩展排序模式。我认为一个更好,但这取决于你。