我有一个复杂的SphinxQL查询,最后,通过特定字段Preferred
对结果进行排序,以便所有索引值为Preferred = 1的所有记录都来自所有记录w Preferred = 0。我也按重量()订购,所以基本上我最终得到:
Select * from idx_X where MATCH('various parameters') ORDER by Preferred DESC,Weight() Desc
问题在于,虽然首先记录首选记录,但我最终会得到按ID排序的记录,这些记录将来自一个字段Vendor的结果放在块中,例如我得到:
Beta Shipping
Beta Shipping
Beta Shipping
Acme Widgets
Acme Widgets
Acme Widgets
Acme Widgets
Acme Widgets
在这种情况下,这不符合我的目的(通常一个'供应商'将有1000个结果)
所以我希望基本上做到:
ORDER BY Preferred DESC,weight() DESC,ID RANDOM
因此,在获得权重为(例如)100
的首选供应商之后,我将获得随机供应商与其中的块。
更新:虽然我确实在另一个Stackoveflow Question找到了可能的答案
问题是它似乎需要SPH_SORT_EXTENDED
,我被迫使用SPH_RANK_PROXIMITY
(ranker = proximity),我不清楚我是否可以结合排名和排序。
更新2:如果我删除现有的两级订单并且只执行Order by Rand()
,它确实会返回随机ID。但是我无法在Rand()
之后添加Order by Preferred DESC,Weight() DESC
或者我收到以下错误:
1064 - sphinxql: syntax error, unexpected '(', expecting $end near '()
可悲的是,RAND()
只能作为一个单一的排序表达式,但它可以作为一个选择函数....
Select *, RAND() AS r from idx_X where MATCH('various parameters')
ORDER by Preferred DESC,Weight() Desc, r DESC
或者如果想要更一致的排序,但仍然混合,例如可以在字符串属性上使用CRC32()
函数
Select *, CRC32(title) AS r from idx_X where MATCH('various parameters')
ORDER by Preferred DESC,Weight() Desc, r DESC
也可以将结果限制为每个供应商的一些(供应商需要是一个属性)
Select * from idx_X where MATCH('various parameters')
GROUP 3 BY vendor_id ORDER by Preferred DESC,Weight() Desc
N组是一个非常有用的sphinx功能。