限制Sphinx中{OR}条件的结果

时间:2016-02-12 11:37:34

标签: sphinx

我试图通过某种方式对它们进行分组来限制结果,

此查询尝试应该清楚:

  

@namee(" Cameras")限制5 | @namee("手机")限制5 | @namee("洗衣机")限制5 | @namee("图形卡")限制5

其中namee是列

基本上我试图根据具体标准限制结果。 这可能吗 ?做任何我想做的事情的替代方式。

我正在使用sphinx 2.2.9

1 个答案:

答案 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时才有效,如果想要不同的限制要复杂得多!)