限制 Sphinx 中 OR 条件的结果

Limit results on OR condition in Sphinx

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

这个查询尝试应该清楚:

@namee ("Cameras") limit 5| @namee ("Mobiles") limit 5| @namee ("Washing Machine") limit 5| @namee ("Graphic Cards") limit 5

其中 namee 是列

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

我在 sphinx 2.2.9

没有 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")') 

(@@relaxed 很重要,因为字段不同,匹配必须来自不同的索引)

现在限制它们...因为每个关键字匹配必须来自不同的索引,并且每个索引都有一个唯一的属性,该属性标识匹配的术语...。

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