限制 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 个时才有效,如果想要不同的限制则要复杂得多!)
我试图通过某种方式对结果进行分组来限制结果,
这个查询尝试应该清楚:
@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 个时才有效,如果想要不同的限制则要复杂得多!)