2015-12-15 63 views
0

我有以下手册斯芬克斯查询(经由MySQL客户端),即产生正确的结果,我想通过从导轨思考斯芬克斯调用它。对于我的生活,我正在思考如何在思维狮身人面像中做出“独特”的查询工作。通过,思考斯芬克斯组与重复计数

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狮身人面像,而不是mySQL。我使用mySQL客户端连接到Sphinx,如:mysql -h 127.0.0.1 -P 9306。这适用于调试/开发。我的实际分贝是Postgres。

鉴于此,并添加更多的上下文,我试图结合思考斯芬克斯group_bycount('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 

我也曾尝试使用构面,但无济于事:

Product.search group_by: :merchant_name, facets: :part_number 
Product.facets :part_number, group_by: :merchant_name 

有关其他信息,并看看这可以通过思考狮身人面像调用来完成,这里是一个基本的例子。我有一个产品表(和相关索引),列出了商家和他们的产品(我同意,它可以进行标准化,但是它来自数据馈送,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 | 
+-----------------+-------------------+ 

的思维狮身人面像,我想:一组)的行由商人,和b)为每个组创建一个“独特”的产品数量。

上面的例子,应该给予以下结果:

+-----------------+------------------------+ 
| merchant  | count(DISTINCT product | 
+-----------------+------------------------+ 
| Best Buy  | 2     | 
| Amazon  | 3     | 
+-----------------+------------------------+ 
+0

什么是与查询的问题? merchant_name是否返回整数?或者,除此之外,总值是否不准确?你使用的是什么版本的狮身人面像? – pat

+0

Pat,我的原始查询通过MySQL客户端(它证明我的索引和属性起作用)完美地对抗Sphinx,我只是无法将查询的'区域'部分写入ThinkingSphinx调用。 –

回答

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 
) 
+0

嗨帕特,感谢您的及时回复!我正在编写自己的连接对象,但更愿意使用Thinking Sphinx已经创建和管理的连接。 –

+0

现在我已经有了这个工作,我发现您必须为我的属性创建自己的CRC值,这些属性已经转换为bigint。我可以将sphinx_internal_id映射回我的id,但只需要再问一次,是否有办法使用Thinking Sphinx方法创建相同的group_by merchant_name/count unique part_number结果? 我缺少一些基本的w/TS吗? –

+0

马丁,我不是很追随:以上述查询不是你所追求的是什么?或者更好的是,你想达到什么目标? – pat