我使用 SphinxQL 在产品数据库中进行搜索和过滤,并存储每个用户的最后 x 个搜索短语。我想知道是否可以向每个用户显示所有产品(所有行)但与以前的搜索相关。
假设一位用户寻找手机(iphone、galaxy s7 ...),即。电子类。我想随机向他展示所有产品,但电子产品类别的产品更频繁,带有这些搜索关键字的产品更频繁。
狮身人面像甚至可能吗?
感谢和抱歉英语。
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 函数,可用于生成采样搜索结果。这不是随机的,但它可能会给出足够相似的结果 - 即只是混合结果)
另一种选择可能是创建附加到每个结果的随机数。具有重叠范围的高数和低数。
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。...可以更改数字“重叠”的大小以调整匹配/不匹配结果的组合。
(添加为一个新的答案,因为它是一个完全不同的想法,尽管使用相同的“所有”关键字)