我使用SphinxQL在产品数据库中进行搜索和过滤,并存储每个用户的最后x个搜索短语。我想知道是否有可能向所有用户显示所有产品(所有行),但与之前的搜索相关。
让我们说一个用户寻求手机(iphone,galaxy s7 ......),即。电子类。我想随机向他展示所有产品,但更频繁地使用电子类别的产品和更频繁地搜索关键字的产品。
是否可以使用Sphinx?
谢谢,对不起英语。
答案 0 :(得分:1)
Sphinx没有'模式'来做到这一点。但可以非常接近......
可以使用MAYBE运算符
MATCH('_all_ MAYBE electronics MAYBE (galaxy s7)')
复杂性需要一种匹配所有产品的方法。根据您的数据,您可能已经有一个单词可以使用(例如,在每个单独的产品中使用单词'the'),或者在索引期间将单词添加到每个文档。
...使用MAYBE可以使匹配结果具有更高的权重。
但你不想严格按重量排序。所以需要一个不同的算法,稍微改变一下结果(因为你真的不想'随机'!)
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空间上,将它们混合起来。但是类别结果仍然倾向于首先在每个乐队中显示。
如果你有一个不同于ID的不同属性可能会更好,那就更加分散了。或者可以在结果中添加一个有意的随机属性)
...有各种各样的变化,你的想象力是唯一的限制,这个基本的技术可以用来混合引用一点。
(还有其他可能性,Sphinxes鲜为人知的GROUP N BY函数,可用于产生一个采样搜索结果。这不是随机的,但它可能会给出足够相似的结果 - 即只是混合结果)
答案 1 :(得分:1)
另一种方法是,可能会创建附加到每个结果的随机数。高数字和低数字,具有重叠范围。
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 CAN仍然小于rand_low。 ...可以改变数字的大小'重叠'调整匹配/非匹配结果的混合。
(作为一个新的答案添加为一个非常不同的想法,虽然使用相同的'所有'关键字)