Sphinx:按以前的搜索顺序显示所有结果

Sphinx: Show all results order by previous searches

我使用 SphinxQL 在产品数据库中进行搜索和过滤,并存储每个用户的最后 x 个搜索短语。我想知道是否可以向每个用户显示所有产品(所有行)但与之前的搜索相关。

假设一位用户寻找手机(iphone、galaxy s7...),即。电子类。我想随机向他展示所有产品,但更频繁地向他展示电子产品类别的产品,以及更频繁地展示具有这些搜索关键字的产品。

Sphinx 有可能吗?

谢谢,对不起英语。

Sphinx 没有 'mode' 可以做到这一点。但是可以非常接近...

可以使用 MAYBE 运算符

MATCH('_all_ MAYBE electronics MAYBE (galaxy s7)')

复杂的是需要一种方法来匹配所有产品。根据您的数据,您可能已经有一个可以使用的词(例如每个产品中的 'the' 之类的词),或者在索引期间将这个词添加到每个文档中。

... 使用 MAYBE 可以使匹配结果具有更高的权重。

但您不想严格按重量排序。所以需要一个不同的算法,稍微打乱结果(因为你不是真的想要 'random'!)

SELECT id, IDIV(id/10000) AS int,WEIGHT() AS w 
FROM index WHERE MATCH('_all_ MAYBE electronics MAYBE (galaxy s7)') 
ORDER BY int DESC, w DESC;

这会根据 ID 创建条带,因为理论上结果可以分布在所有 ID -space 会使它们有点混淆。但类别结果仍倾向于在每个波段内首先显示。

如果您有一个不同于 ID 的其他属性可能会更好,一些更分散的东西。或者可以在结果中添加一个有意的随机属性)

...有各种各样的变化,你的想象力是唯一的限制,这个基本的技术可以用来混合引用。

(还有其他可能性,Sphinxes 鲜为人知的 GROUP N BY 函数,可用于产生抽样搜索结果。这不是随机的,但它可能会给出足够相似的结果 - 即只是混淆结果)

另一种方法可能是为每个结果创建随机数。一个高数和一个低数,范围重叠。

sql_query = SELECT id, RAND()*100 AS rand_low, (RAND()*100)+50 AS rand_high, ...
sql_attr_uint = rand_low
sql_attr_uint = rand_high

然后可以安排排名表达式根据是否匹配来选择这些数字中的任何一个,并按结果排序。

SELECT id FROM index WHERE MATCH('_all_ MAYBE electronics MAYBE (galaxy s7)') 
OPTION ranker=expr('IF(doc_word_count>1,rand_high,rand_low)');

会混的。但是匹配其中一个单词的结果更有可能首先出现(因为使用加权随机数)——它仍然只是一个机会,因为 rand_high 仍然可以小于 rand_low。 ... 可以更改数字 'overlap' 的大小以调整 matching/non 匹配结果的组合。

(添加为新答案,因为它是一个完全不同的想法,尽管使用相同的 'all' 关键字)