Rails 5,思考狮身人面像,索引和搜索通过关系来解决问题

时间:2017-10-15 13:59:55

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

我有一个Rails应用程序,我想在其中使用Thinking Sphinx进行搜索。我在以下模型之间有很多关系,Product有很多TypeProductType

# 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 ID过滤视图中显示的产品。

我的相关索引目前看起来像这样(注意,我很久没有使用过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中传递link_to个数组,就像这样(让我知道是否有更好的方法):

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

在我的ProductsController我尝试根据给定的Type ID过滤结果,如下所示:

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 个答案:

答案 0 :(得分:1)

这里需要注意几个问题:

首先,您在rake ts:rebuild期间看到的错误指出您没有在ProductType Sphinx索引中设置任何字段 - 没有indexes调用您希望的文本数据搜索。你真的在搜索ProductType吗?如果是这样,您期望人们匹配哪些文字?

如果您没有搜索该模型,则无需为其提供Sphinx索引。

其次,您的搜索问题 - 您使用整数对product_types进行过滤,这是有道理的。但是,在您的索引中,您已将product_types定义为字段(使用indexes)而不是属性(使用has)。鉴于它的整数值并且您可能不希望有人在搜索输入中键入ID,您几乎肯定希望这是一个属性 - 所以更改{{1} }到产品索引定义中该行的indexes,然后运行has