按日期称量狮身人面像结果

时间:2012-02-09 20:49:24

标签: php sql search sphinx

我在网站上使用Sphinx Search来跟踪各种表条目。这些条目包含日期组件,并且在传递数据后不太相关。

如何让Sphinx为符合搜索条件的结果(例如关键字搜索)分配更多权重,然后为那些过去有日期但仍满足搜索条件的结果分配较少的权重?下图应该有助于传达我的需求:

包含要搜索的数据的表:

--------- ------------------ ---------
entry_id | title            | date    |
--------- ------------------ ---------
1         Tennis Racquet     12-10-2010
2         Basketball         03-24-2011
3         Tennis             03-03-2012
4         Skydiving          09-16-2012
5         Fishing            11-27-2012
6         Tennis Court       02-09-2013

搜索字词:

tennis

搜索结果:

  1. 第3项 - 网球
  2. 第6条 - 网球场
  3. 第1项 - 网球拍 - 由于此条目的日期早于今天的日期(2-9-2012),但最后返回,但仍与搜索字词匹配

2 个答案:

答案 0 :(得分:4)

我找到了一种使用@mobius'SetSortMode示例的变体来实现此目的的方法。

我没有使用SPH_SORT_EXTENDED,而是使用SPH_SORT_EXPR以及下面的表达式:

$cl->SetSortMode ( SPH_SORT_EXPR, 
        " @weight + ( -1000000000/(" . time() . " - course_date_ts)) ");

这使我能够对即将到来的结果进行更高的权衡,然后将结果略微降低,最后将结果保持不变。

分子中的大数字与UNIX时间戳中的小数位数相对应。

答案 1 :(得分:1)

在您的sphinx.conf中,您应该在选择查询中将日期指定为时间戳:

SELECT entry_id, title, UNIX_TIMESTAMP(date) as date_timestamp FROM Table;

并指定date_timestamp列的类型为timestamp:

sql_attr_timestamp = date_timestamp

现在,您可以按时间戳列对结果进行排序。检查Sphinx手册http://sphinxsearch.com/docs/current.html#sorting-modes

的排序部分

即在PHP中:

$search->SetSortMode( SPH_SORT_EXTENDED, '@weight DESC, date_timestamp ASC );