2013-01-09 147 views
0

使用Sphinx 2.0.6,有没有办法让狮身人面像根据文档ID返回特定的订单?狮身人面/ PHP:狮身人面像可以返回给定数组的匹配顺序吗?

例如,假设有1000个文档都有id 1-1000。但是我想要返回,依次为ID 999,1000,4,5,2等等。

此用例:定位是动态的,需要通过Sphinx完成。定位值需要作为可以即时更改的属性。这也是分页 - 所以我不能简单地收集ID集并请求一个SQL。狮身人面像本身需要返回我给它的特定顺序。

$cl->setSelect("*,FIND_IN_SET(id,".implode($id_array).") AS id_position"); 
$cl->SetSortMode(SPH_SORT_EXTENDED, 'id_position DESC'); 

$cl->setSelect("*,FIELD(id,".implode($id_array).") AS id_position"); 
$cl->SetSortMode(SPH_SORT_EXTENDED, 'id_position DESC'); 

不幸的是,看起来像Sphinx支持FIELD()和FIELD_IN_SET()。

任何想法如何完成此任务?我现在处于亏损状态,可以使用帮助!

回答

0

非常感谢!这是一个很好的解决方案,可以通过动态ID数组进行排序。 (现实世界中使用......用户的收藏,推荐产品,用户访问量最大的)

狮身人面像PHP代码:

$cl->SetOverride("id_position", SPH_ATTR_INTEGER, user_id_position()); 
$cl->SetSortMode(SPH_SORT_EXTENDED, "id_position ASC"); 

PHP函数创建关联数组:

function user_id_position() { 
     $id = $_original_id_list // This variable is the original id list that is in the correct order 
     $max = count($id); 
     $set = array(); 
     for ($i=0;$i < $max;$i++) 
      $set[$id[$i]] = $i; // turns the array into array(document_id1 => position, document_id2 => position, ...) 
     return $set; 
} 

的sphinx.conf

source index_name 
{ 
    sql_query      = \ 
      SELECT \ 
        *, 0 as id_position \ 
      FROM \ 
        database_table; 
    sql_attr_uint   = id_position 
} 

将信息添加到sphinx.conf后,您需要--rotate和它会工作

0

您是否需要使用该数组结构? 使用Sphinx,您可以使用“ORDER BY id”语句,然后在获取结果时使用:

$ cl-> SetSortMode(SPH_SORT_ATTR_DESC,“id”);

+0

是的,我需要保持数组结构。 – CrazyVipa