2013-04-05 24 views
0

我正在寻找狮身人面像和思维狮身人面像,我需要你的意见和帮助,我想要做的是以下几点:思维狮身人面像:sort_mode =>:time_segments或:sort_mode =>:expr与@ weight * created_at?

我有一个新闻列表(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 

回答

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,这样的变化反映在您的索引文件和狮身人面像守护意识到这一点。

至于你如何排序......你有几个选项。在你的例子中,你主要按照相关性排序,但是具有匹配相关性分数的任何东西都会先列出较新的项目。我认为这会工作得很好。

如果你想使用狮身人面像的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时间戳与表达式中的相关性相关联 - 这取决于您。有可能有帮助的公式,但我认为这可能是额外的复杂性,你可能不需要。

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

+0

非常感谢你Pat你真的拿出了一些疑惑,这个time_segments排序mod完全适合。 你知道我必须做什么才能使用time_segments的相同脚本,但仍然匹配某个字段(为什么不试试@weight + views有一天呢?哈哈哈),就像Pete Spicer在本次讨论中所说:[http://sphinxsearch .com/forum/view.html?id = 3537) 我不知道如何使用思维 - 狮身人面像来做这件事,所以你写了一些关于它的东西,或者你有我遵循的一些教程吗?谢谢。 – 2013-05-02 16:04:47

+0

感谢您的帮助,我不能肯定您,因为我的帐户是新的,但非常感谢。 – 2013-05-23 19:07:33

+0

你应该能够接受答案吗?另外:要使用Pete Spicer建议的内容,请将其长表达式(IF ...)作为字符串传递给:order,并将sort_mode设置为:expr。 – pat 2013-05-24 02:45:25