有没有办法用 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 特性而鲜为人知。
我有一个复杂的 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 特性而鲜为人知。