有没有办法用 Sphinx 随机化搜索结果(记录 ID)?

Is there a way to randomize search results (record ids) with Sphinx?

我有一个复杂的 SphinxQL 查询,它最后按特定字段 Preferred 对结果进行排序,以便所有具有 Preferred=1 索引值的记录都排在所有 w Preferred=0 的记录之前.我也按 weight() 订购,所以基本上我最终得到:

Select * from idx_X where MATCH('various parameters') ORDER by Preferred DESC,Weight() Desc

问题是,虽然首选记录排在第一位,但我最终得到的是按 ID 排序的记录,该 ID 将来自一个字段 Vendor 的结果放入块中,例如我得到:

Beta Shipping Beta Shipping Beta Shipping Acme Widgets Acme Widgets Acme Widgets Acme Widgets Acme Widgets

在这种情况下不符合我的目的(通常一个 'Vendor' 会有 1000 个结果)

所以我希望从根本上做到:

ORDER BY Preferred DESC,weight() DESC,ID RANDOM

因此,在找到权重为(例如)100 的首选供应商后,我将获得随机供应商与它们的块。

更新:尽管我确实在另一个 Stackoveflow Question

中找到了可能的答案

问题是它似乎需要 SPH_SORT_EXTENDED 而我被迫使用 SPH_RANK_PROXIMITY (ranker=proximity) 我不清楚我是否可以结合排名和排序。

更新 2:如果我删除现有的两级订单并只执行 Order by Rand() 它确实 returns 随机 ID。但是,我无法在 Order by Preferred DESC,Weight() DESC 之后添加 Rand(),否则会出现以下错误:

1064 - sphinxql: syntax error, unexpected '(', expecting $end near '()

遗憾的是,RAND() 只能用作单个排序顺序表达式,但它确实可以用作 select 函数....

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 特性而鲜为人知。