我注意到SPH_SORT_EXPR模式中的sort表达式的结果是float。我很失望因为float不能代表我想要的数据。
我想要达到这样的效果(就SPH_SORT_EXTENDED模式而言):
@weight DESC attr_a DESC (attr_b - 10000*attr_c) DESC
所以我试着用SPH_SORT_EXPR模式表示它,如下所示:
2^33 * @weight + 2^32 * attr_a + attr_b - 10000 * attr_c
其中attr_a
是boolean
,attr_b
int
和attr_c
是一个小int。
然而,这种方法不够灵敏,因为可以用float表示的两个连续大值之间的间隙太大而无法区分sphinx匹配(其中许多具有相同的@expr
值)。
我尝试使用sqrt
但效果是一样的。
2^17 * floor(sqrt(@weight)) + 2^16 * attr_a + sqrt(attr_b - 10000 * attr_c)
有谁知道任何解决方案,解决方法等?
我非常感谢所有的建议。
答案 0 :(得分:1)
我认为权重实际上是无符号的32位int。所以只是2 ^ 32个整数溢出。
您是否尝试过使用SPH_SORT_EXTENDED
?
->setSelect("*, (attr_b - 10000*attr_c) AS sorter");
->setSortMode(SPH_SORT_EXTENDED, "@weight DESC, attr_a DESC, sorter DESC");
(SPH_SORT_EXPR
只创建虚拟属性@expr
,然后对其进行排序,在此明确创建虚拟sorter
属性