我有以下手动Sphinx查询(通过mySQL客户端),即产生正确的结果,我想通过Rails的Thinking Sphinx调用它。对于我的生活,我正在努力学习如何制作一个独特的'在Thinking Sphinx中查询工作。
mysql> select merchant_name, count (distinct part_number) from product_core group by merchant_name;
+-----------------------+-----------------------------------------+
| merchant_name | count (distinct part_number) |
+-----------------------+-----------------------------------------+
| 1962041491 | 1 |
| 3208850848 | 1 |
| 1043652526 | 48754 |
| 770188128 | 1 |
| 374573991 | 34113 |
+-----------------------+-----------------------------------------+
请注意:这个mySQL查询是agaist Sphinx,而不是mySQL。我使用mySQL客户端连接到Sphinx,如:mysql -h 127.0.0.1 -P 9306
。这适用于调试/开发。我的实际数据库是Postgres。
鉴于此,并且为了添加更多上下文,我尝试将group_by
与S count('Distinct' ...)
结合起来。
所以,这个查询有效:
Product.search group_by: :merchant_name
...而且,此查询有效:
Product.count ('DISTINCT part_number')
...但是,这个组合查询会抛出错误:
Product.search group_by: :merchant_name, count ('DISTINCT part_number')
SyntaxError: (irb):90: syntax error, unexpected ( arg, expecting keyword_do or '{' or '('
...merchant_name, count ('DISTINCT part_num...
merchant_name和part_number都被定义为属性。
环境:
Sphinx 2.2.10-id64-release (2c212e0)
thinking-sphinx 3.1.4
rails 4.2.4
postgres (PostgreSQL) 9.3.4
我也尝试过使用Facets,但无济于事:
Product.search group_by: :merchant_name, facets: :part_number
Product.facets :part_number, group_by: :merchant_name
有关其他信息,以及是否可以通过Thinking Sphinx调用完成此操作,这是一个基本示例。我有一个产品表(和相关索引),列出商家及其产品(我同意,它可以标准化,但它来自数据源,Sphinx可以按原样处理):
+-----------------+-------------------+
| merchant | product |
+-----------------+-------------------+
| Best Buy | Android phone |
| Best Buy | Android phone |
| Best Buy | Android phone |
| Best Buy | iPhone |
| Amazon | Android phone |
| Amazon | iPhone |
| Amazon | iPhone |
| Amazon | iPhone |
| Amazon | Onkyo Receiver |
+-----------------+-------------------+
使用Thinking Sphinx,我想:a)按商家划分行,b)为每个组创建“不同”的产品计数。
上面的例子,应该给出以下结果:
+-----------------+------------------------+
| merchant | count(DISTINCT product |
+-----------------+------------------------+
| Best Buy | 2 |
| Amazon | 3 |
+-----------------+------------------------+
答案 0 :(得分:1)
您无法通过模型的搜索调用运行此查询,因为它设置为始终返回模型的实例,而您想要的是原始结果。以下代码应该可以解决问题:
ThinkingSphinx::Connection.take do |connection|
result = connection.execute <<-SQL
SELECT merchant_name, COUNT(distinct part_number)
FROM product_core
GROUP BY merchant_name
SQL
result.to_a
end
或者,我认为这可以通过正常的search
调用:
Product.search(
select: "merchant_name, COUNT(distinct part_number) AS count",
group_by: :merchant_name,
middleware: ThinkingSphinx::Middlewares::RAW_ONLY
)