0

使用 Sphinx 2.0.6,有没有办法让 sphinx 根据文档 ID 返回特定顺序?

例如,假设有 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()。

任何想法如何完成此任务?我现在不知所措,可以使用帮助!

4

2 回答 2

0

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

$cl->SetSortMode(SPH_SORT_ATTR_DESC, "id");

于 2013-01-09T17:52:49.977 回答
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;
}

狮身人面像配置文件

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

将信息添加到 sphinx.conf 后,您需要 --rotate 并且它会起作用

于 2013-01-09T22:19:11.330 回答