2010-09-17 76 views
0

我有此表达其正在按预期在思考斯芬克斯:如何在(思考)sphinx extended2模式下进行属性匹配?

Customer.search :with => {:signer_id => 23} 

但我需要编写一个表达式与某些属性的OR,像signer_id是23或admin_level是42,所以移动到扩展匹配模式和写这个:

Customer.search "@signer_id 23", :match_mode => :extended2 

它根据我的Sphinx relevant documentation的理解,应该是等价的,但它并没有在所有匹配任何内容。任何想法我做错了什么?我如何写一个思维扩展的狮身人面像表达式?

复制和从控制台粘贴:

ruby-1.8.7-p302 > Customer.search(:with => {:signer_id => 23}).count 
=> 20 
ruby-1.8.7-p302 > Customer.search "@signer_id 23", :match_mode => :extended2 
=> [] 
ruby-1.8.7-p302 > Customer.search("@signer_id 23", :match_mode => :extended2).count 
=> 0 

更新:固定的ID(32 - > 23)。

回答

0

我这样做是为了匹配我已标准化的字段。这可以通过在全文搜索中使用相同的文本来减少数据库中的流失量。

查询:'pizza | @product_codes(965 | 1636 | 1848 | 2939 | 4227 | 5067 | 5735)| @brand_codes(1485)| @service_codes(2782)

请注意,由于其他答案指出你不能这样做属性,这些都必须是索引字段。

我蛮力它们像这样:

 indexes '(select group_concat(products.id) from business_products inner join products on (products.id = business_products.product_id) where business_id = `businesses`.`id` group by business_id)', :as => :product_codes, :type => :integer 

此外,您将需要设置这个

min_word_len: 1 

减少一个字的字符数,否则它不会匹配你1和2位数字代码。

+0

我犯了同样的错误和数学奥运会;他们不敢相信像我这样的白痴竟然赢了它;)无论如何,我只是在这里犯了错误,代码很好,仍然没有工作。 – Pablo 2010-09-17 16:16:20

+0

我在这里重写了我的答案。 – 2010-09-20 03:40:52

0

我没有发现文档中说您可以使用@attribute value语法的部分 - 它只用于字段,而不用于属性。至少,这是我的理解。如果我错了,将是太棒了:)

+0

字段和属性之间有什么区别? – Pablo 2010-09-19 09:07:48

+0

字段是您的记录的文本数据 - 即:所有应与搜索查询匹配的字词。属性是整数,时间戳,布尔值,浮点数来对结果进行排序和过滤。阅读本页上的字段和属性部分:http://freelancing-god.github.com/ts/en/sphinx_basics.html – pat 2010-09-21 02:21:27

+0

@pat抱歉评论一个两岁的线程,但是你不是吗? ThinkingSphinx的作者?对于写这个东西的人来说,这是一个非常谦逊的回答! – Samo 2012-09-26 16:34:09