【问题标题】:Sphinx custom sorting (FIELD)Sphinx 自定义排序 (FIELD)
【发布时间】:2013-04-07 11:40:34
【问题描述】:

我,有桌子:

id | geo_id | values ....
 1     1      wvrevev
 2     2      wvrevev
 3     3      wvrevev
 3     4      wvrevev
 7     5      wvrevev
 8     6      wvrevev
 9     8      wvrevev

在狮身人面像索引的两个字段中:id 和 geo_id

我需要某种类型,它会位于我指定记录的顶部。在 SQL 中收到这样的请求:

SELECT * FROM table ORDER BY FIELD(geo_id, "2", "3", "6") DESC

如何在 Sphinx 中指定排序? 此条目:

$cl->SetSortMode(SPH_SORT_EXTENDED, "FIELD(geo_id, "2", "3", "6") DESC");

抛出错误:

enter code hereindex sphinxoffers: sort-by attribute 'field' not found

如何摆脱困境?

【问题讨论】:

    标签: php search full-text-search sphinx


    【解决方案1】:
    1. Sphinx 没有 FIELD() 函数
    2. 您不能在 SORT_EXTENDED 模式下指定函数。有排序表达式,但由于 1 无济于事。

    如果您总是使用该列表,可以在索引时将其创建为属性...

    sql_query = SELECT id, geo_id, FIELD(geo_id, "2", "3", "6") AS sorter, .... 
    

    然后在 sphinxAPI 代码中...

    $cl->SetSortMode(SPH_SORT_EXTENDED, "sorter DESC");
    

    [编辑] 或(添加来自 cmets 的信息)...

    可以使用嵌套的 IF() 函数构建与 FIELD 相同的逻辑。可能可以使用 EXPRESSION 排序,或者只是使用 SetSelect 创建一个虚拟属性,然后按此排序(使用 EXTENDED)


    [Edit2] 在 sphinxQL 中使用该新属性,它只是ORDER BY 中使用的另一个排序属性(sphinxQL 实际上只是 SPH_SORT_EXTENDED 排序)...

    SELECT * FROM index WHERE MATCH(...) ORDER BY sorter DESC, WEIGHT() DESC 
    

    之类的。

    【讨论】:

    • 如果我这个属性是动态的,用SetSelect的辅助是不是不可能?
    • 有可能,但由于没有 FIELD() 函数,因此必须从 IF() 函数中构造逻辑。
    • 谢谢!有效。抱歉,我还不能评分!
    • 我如何使用 pdo/mysql 语法来达到同样的效果?
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2014-07-18
    • 2011-12-16
    • 2012-01-01
    相关资源
    最近更新 更多