2017-10-15 67 views
0

我有一個Rails應用程序,我想在其中使用思維獅身人面像進行搜索。我有一個有很多雖然關係以下型號,Product有很多Type秒通過ProductTypeRails 5,思維獅身人面像,索引和搜索已通過關係meny

# Product.rb 
has_many :product_types 
has_many :types, through: :product_types 

# Type.rb 
has_many :product_types 
has_many :products, through: :product_types 

# ProductType.rb 
belongs_to :product 
belongs_to :type 

在我ProductsController索引操作我希望能夠過濾哪些產品的基礎上給出Variant IDS視圖中顯示。

我的相關指標目前看起來是這樣的(注意,我沒有在很長一段時間使用ThinkingSphinx):

# product_index.rb 
ThinkingSphinx::Index.define :product, :with => :active_record do 
    indexes name, :sortable => true 
    indexes description 
    indexes brand.name, as: :brand, sortable: true 

    indexes product_types.type.id, as: :product_types 

    has created_at, updated_at 
end 

# type_index.rb 
ThinkingSphinx::Index.define :type, :with => :active_record do 
    indexes name, :sortable => true 
end 

# product_type_index.rb 
ThinkingSphinx::Index.define :product_type, :with => :active_record do 
    has product_id, type: :integer 
    has type_id, type: :integer 
end 

我目前通過的:product_types ID的數組在link_to,像這樣(讓我知道是否有更好的方式來做到這一點):

= link_to "Web shop", products_path(product_types: Type.all.map(&:id), brand: Brand.all.map(&:id)), class: "nav-link" 

在我ProductsController我試圖篩選基於給定Type IDS這樣的結果:

product_types = params[:product_types] 
@products = Product.search with_all: { product_types: product_types.collect(&:to_i) } 

當我運行rake ts:rebuild我得到以下錯誤:

indexing index 'product_type_core'... 
ERROR: index 'product_type_core': No fields in schema - will not index 

當我試圖查看在瀏覽器中我得到以下錯誤的觀點:

index product_core: no such filter attribute 'product_types' 
- SELECT * FROM `product_core` WHERE `sphinx_deleted` = 0 AND 
`product_types` = 1 AND `product_types` = 2 AND `product_types` = 3 
LIMIT 0, 20; SHOW META 

如何任何想法正確設置我的索引(和查詢)爲這種情況?

回答

1

有幾個問題要注意這裏:

首先,你在rake ts:rebuild所看到的錯誤被指出你沒有設置你的ProductType獅身人面像索引的字段 - 沒有indexes呼籲文本數據你希望搜索。你真的在搜索ProductType嗎?如果是這樣,你期望人們匹配哪些文本?

如果您不是在該模型上搜索,則不需要爲其創建Sphinx索引。

其次,您的搜索問題 - 您正在使用整數對product_types進行篩選,這很有意義。但是,在索引中,您已將product_types定義爲字段(使用indexes)而不是屬性(使用has)。鑑於它是整數值,並且您可能不希望有人在搜索輸入中鍵入ID,幾乎可以肯定這是一個屬性 - 所以請將產品索引定義中該行的indexes更改爲has ,並運行ts:rebuild

+0

Thanks @pat!我已經更新了我的索引,如下所示:'有product_types.type.id,如::type_ids'。我在[Github](https://github.com/pat/thinking-sphinx-examples)上找到了你的高級搜索示例,並且我試圖做類似的事情。我的搜索的相關部分如下所示:'@products = Product.search params [:query],with_all:options [:with_all]','options [:with_all]'看起來像這樣:'{:type_ids => [2,3]}。但我總是得到0個結果:'SELECT * FROM'product_core'WHERE'sphinx_deleted'= 0 AND'type_ids'= 2 AND'type_ids'= 3 LIMIT 0,20'。任何想法我失蹤? – Anders

+0

只需確認:您是否期望獲得所有連接到* type id 2和type id 3的產品?(而不是連接到任一個但不一定兩者的產品)。此外,它沒有顯示在你共享的代碼中,但是你是否正在將'params [:product_types]'翻譯成Type實例? – pat

+0

不,我希望所有的產品有1或3型。我已經改變了這一點'params [:product_types]'從我原來的問題。我改成了:'options = {:with_all => {}}','options [:with_all] [:type_ids] = params [:filter] [:type] .keys.map(&:to_i)'(導致'{:type_ids => [2,3]}'和'@products = Product.search params [:query],with_all:options [:with_all]',我可以用更新後的代碼更新我的問題。對你的幫助@pat! – Anders

相關問題