详解 Sphinx 中的排序

可使用如下模式对搜索结果排序:

  • SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)
  • SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面)
  • SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)
  • SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序
  • SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排列。
  • SPH_SORT_EXPR 模式,按某个算术表达式排序。
SPH_SORT_EXTENDED 模式

在 SPH_SORT_EXTENDED 模式中,您可以指定一个类似SQL的排序表达式,但涉及的属性(包括内部属性)不能超过5个,例如:

@relevance DESC, price ASC, @id DESC

只要做了相关设置,不管是内部属性(引擎动态计算出来的那些属性)还是用户定义的属性就都可以使用。内部属性的名字必须用特殊符号@开头,用户属性按原样使用就行了。在上面的例子里,@relevance@id是内部属性,而price是用户定义属性。

已知的内置属性:

  • @id (匹配文档的 ID)
  • @weight (匹配权值)
  • @rank (等同 weight)
  • @relevance (等同 weight)
  • @random (随机顺序返回结果)

@rank 和 @relevance 只是 @weight 的别名.

PHP 的 API 中只有 SetSortMode($mode, $sortBy) 方法.从上面的文档说明中可知,如果需要设置多个字段依次排序。需要使用下列代码:

$SphinxClient->SetSortMode(SPH_SORT_EXTENDED, "columnA ASC, columnB DESC, columnC ASC");

无法方便的同时设置多个排序。通过继承 SphinxClient 类添加了一个新方法,实现了通过数组设置多个排序。

/**
     * 设定多重排序条件
     * @param Array $orders 排序条件数组
     * @example $order = array (
     *     '0' => array ('attribute' => 'columnname', 'order' => RentSearch::DESC),
     *     '1' => array (//...),
     * );
     */
    public function multiOrder($orders) {
        $orderType = SPH_SORT_EXTENDED;
        $orderString = "";
        foreach ($orders as $order) {
            switch ($order['order']) {
                case self::ASC :
                    $orderString += $order['attribute'] . ' ASC, ';
                    break;
                case self::DESC : 
                    $orderString += $order['attribute'] . ' DESC, ';
                    break;
                default :
                    $orderString += $order['attribute'] . ' DESC, ';
                    break;
            }
        }
        $orderString = substr($orderString, 0, strlen($orderString)-2);
        $this->SetSortModel($orderType, $orderString);
    }


转载于:https://my.oschina.net/airylinus/blog/55836

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值