我试图通过某种方式对它们进行分组来限制结果,
此查询尝试应该清楚:
@namee(" Cameras")限制5 | @namee("手机")限制5 | @namee("洗衣机")限制5 | @namee("图形卡")限制5
其中namee是列
基本上我试图根据具体标准限制结果。 这可能吗 ?做任何我想做的事情的替代方式。
我正在使用sphinx 2.2.9
答案 0 :(得分:1)
没有Sphinx语法直接执行此操作。
最简单的方法就是直接进行4次单独的查询和“UNION'他们在应用程序本身。表现并不可怕。
...如果你真的想在Sphinx中这样做,可以明确一些技巧来接近,但它变得非常复杂。
需要创建4个单独的索引(或者根据需要创建尽可能多的术语!)。每个都有相同的数据,但与字段称为不同的东西。 (它们互相复制!)你还需要一个属性(更多关于为什么以后)
source str1 {
sql_query = SELECT id, namee AS field1, 1 as idx FROM ...
sql_attr_unit = idx
source str2 {
sql_query = SELECT id, namee AS field2, 2 as idx FROM ...
sql_attr_unit = idx
... etc
然后在4个索引上创建单个分布式索引。
然后可以运行单个查询以使所有结果有点神奇地联合......
MATCH('@@relaxed @field1 ("Cameras") | @field2 ("Mobiles") | @field3 ("Washing Machine") | @field4 ("Graphic Cards")')
(@@ relax是重要的,因为字段不同。匹配必须来自不同的索引)
现在限制它们...因为每个关键字匹配必须来自不同的索引,并且每个索引都有唯一的属性,该属性标识哪个术语匹配....
在Sphinx中,有一个很好的GROUP N BY
,你只能从每个属性得到一定数量的结果,所以可以......(把所有这些放在一起)
SELECT *,WEIGHT() AS weight
FROM dist_index
WHERE MATCH('@@relaxed @field1 ("Cameras") | @field2 ("Mobiles") | @field3 ("Washing Machine") | @field4 ("Graphic Cards")')
GROUP 4 BY idx
ORDER BY weight DESC;
简单呃?
(注意它只有在每个索引需要4时才有效,如果想要不同的限制要复杂得多!)