我有一个复杂的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 '()
答案 0 :(得分:0)
可悲的是,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
Group by N 通过非常有用的sphinx功能鲜为人知。