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

问题描述 投票:0回答:1

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

random sphinx
1个回答
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

N组是一个非常有用的sphinx功能。

© www.soinside.com 2019 - 2024. All rights reserved.