思考Sphinx集团,具有鲜明的数量

时间:2015-12-15 05:36:11

标签: ruby-on-rails sphinx thinking-sphinx

我有以下手动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                    |
+-----------------+------------------------+

1 个答案:

答案 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
)