0

我有產品數據庫,我用Thinking Sphinx來搜索他們。我有一套相當複雜的條件來找到正確的產品類別和細節。但是,我想優化搜索,以便限制產品的價格和數量,這些都是產品模型的浮動屬性。精煉思維斯芬克斯搜索浮動字段與積極的關係

對於前:

1.9.2p290 :014 > Product.search('eggs').map { |p| "#{p.name}, $#{p.price}" } 
    Sphinx Query (4.6ms) eggs 
    Sphinx Found 984 results 
    Product Load (0.9ms) SELECT "products".* FROM "products" WHERE "products"."id" IN (7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7645, 7646, 7647, 7648, 7650, 7651, 7652, 7653, 7654, 7655) 
[ 
    [ 0] "Egg Beaters Pour Spout, $2.89", 
    [ 1] "Fleischman Regular Egg Beaters Egg Substitute, $3.09", 
    [ 2] "Fleischman Southwest Egg Beaters Egg Substitute, $2.89", 
    [ 3] "Lucerne Best Of The Egg, $2.79", 
    [ 4] "Lucerne Best Of The Egg, $2.69", 
    [ 5] "Lucerne Best Of The Egg, $5.29", 
    [ 6] "Lucerne Best Of The Egg Whites, $2.79", 
    [ 7] "Lucerne Best Of The Egg Whites, $5.29", 
    [ 8] "Papetti Foods All Whites Liquid Egg Whites, $5.89", 
    [ 9] "Papetti Foods Healthier Real Egg Product Better N Eggs, $5.89", 
    [10] "Papettis 100% All Egg Whites, $2.5", 
    [11] "Eating Right Eggs With Omega A, $3.99", 
    [12] "Egglands Best Cage Free Large Eggs, $3.29", 
    [13] "Egglands Best Cage Free Large Grade AA Brown Eggs, $4.39", 
    [14] "Egglands Best Classic Large Eggs, $5.49", 
    [15] "Egglands Best Grade AA Large Eggs, $4.09", 
    [16] "Hard Boiled Eggs Peeled And Ready To Eat, $1.49", 
    [17] "Land O Lakes Cage Free All Natural Large Grade A Brown Eggs, $4.39", 
    [18] "Land O Lakes Farm Fresh Extra Large Brown Eggs, $2.49", 
    [19] "Land O Lakes Organic All Natural Large Grade A Brown Eggs, $5.49" 
] 



1.9.2p290 :015 > Product.search('eggs').class 
ThinkingSphinx::Search < Array 



1.9.2p290 :016 > Product.search('eggs').where("price < ?", 3) 
NoMethodError: Sphinx Query (5.5ms) eggs 
    Sphinx Found 984 results 
    Product Load (0.8ms) SELECT "products".* FROM "products" WHERE "products"."id" IN (7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7645, 7646, 7647, 7648, 7650, 7651, 7652, 7653, 7654, 7655) 
undefined method `where' for #<ThinkingSphinx::Search:0x007feaf30e1880> 
    from /Users/neil/.rvm/gems/ruby-1.9.2-p290/gems/thinking-sphinx-2.0.10/lib/thinking_sphinx/search.rb:174:in `method_missing' 
    from (irb):16 
    from /Users/neil/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.5/lib/rails/commands/console.rb:47:in `start' 
    from /Users/neil/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.5/lib/rails/commands/console.rb:8:in `start' 
    from /Users/neil/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.5/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

如何使用ActiveRelation完善TS找到的匹配文本後,我的搜索?

回答

0

這應該工作:

Product.search 'eggs', :with => {:price => price, :quantity => quantity} 

假設你有三種不同的輸入框來定義搜索字符串('eggs')中,pricequantity,我會試圖尋找精確匹配時使用的是這樣的:

scope = params[:query].present? Product.search params[:query] : scope = Product.search nil 

scope = scope.search with: { :price => params[:price] } if params[:price].present? 
scope = scope.search with: { :price => params[:quantity] } if params[:quantity].present? 

@products = scope 

但是,不會過濾「價格低於x」或「x和y之間的數量」。爲此,你需要使用範圍,因爲思維 - 斯芬克斯。舉例來說,如果你要搜索的產品比給定值低的價格:

Product.search 'eggs', :with => {:price => 0..value} 

,返回匹配的商品查詢'eggs'與和給定值0之間的價格。

如果你要搜索的產品比給定值高的價格:

Product.search 'eggs', :with => {:price => value..Float::MAX} 

返回產品查詢'eggs'與給定值和表示的最大有限浮點數字之間的價格相匹配。