0

我正在研究 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
4

1 回答 1

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 时间戳与表达式中的相关性考虑在内 - 这取决于您。可能有一些公式可以帮助解决这个问题,但我认为这是你可能不需要的额外复杂性。

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

于 2013-04-06T01:10:33.293 回答