我正在研究狮身人面像和思考 - 狮身人面像,我需要你的意见和帮助,我想做的是以下几点:
我有一个新闻列表(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
答案 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时间戳与表达式中的相关性进行分解 - 这取决于您。可能有一些公式可以帮助解决这个问题,但我认为这可能是你不需要的额外复杂性。
如果您认为首先获得较新的结果更为重要,那么请使用时间段。如果您认为首先在搜索查询中获得相关结果更为重要,请在您自己的示例中使用扩展排序模式。我认为一个更好,但这取决于你。