2013-01-09 184 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