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

时间:2017-12-30 14:43:33

标签: random sphinx

我有一个复杂的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 '()

1 个答案:

答案 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功能鲜为人知。