2012-01-05 90 views
1

我使用思维斯芬克斯在两种不同的模式搜索:思维狮身人面像:单一模型的多个指标?

  1. 对正常的搜索功能
  2. 所有模型全部搜索自动完成功能的下拉

单一车型为全搜索为了这个问题,我们假设我有一个人和一个国家模式。

执行常规搜索时,我想要获取所有名称与搜索字符串匹配的人。为了实现这个目标,我在Person索引中添加了一个国家名称索引。迄今为止都很好。

当搜索填充我的自动填充下拉列表时,我想显示与我的搜索字符串匹配的所有国家和所有人。这里出现问题。如果做一个应用程序范围内的搜索,我现在得到:

  1. 所有国家的名字与我的搜索字符串
  2. 所有医生的名字与我的搜索字符串,可惜...
  3. 属于谁所有医生到匹配搜索字符串的国家/地区。

最后一部分为用户提供了一些令人困惑的自动完成结果。是否有任何简单的方法让我通过使用内置功能来避免这种情况,例如在Person模型中有两个索引,并选择哪一种用于每种搜索?

回答

2

我假设你的模型就像下面:

class Person < ActiveRecord::Base 
    belongs_to :country 
    define_index 
    indexes :name 
    indexes country(:name), :as => country_name 
    end 
end 

class Country < ActiveRecord::Base 
    has_many :people # has_many :persons # depending on your singular/plural case 
    define_index 
    indexes :name 
    end 
end 

所以,你可以通过执行查询得到的结果,而无需3(第三个条件):

ThinkingSphinx.search :conditions => {:name => params[:q]}, :classes => [Person, Country] 

但是,如果你想在模型上创建多个索引,它可以像下面的例子那样完成:

class Person < ActiveRecord::Base 
    belongs_to :country 
    define_index :my_first_in do 
    indexes :name 
    indexes country(:name) 
    end 
    define_index :my_second_in do 
    indexes :name 
    end 
end 
+0

仅适用于任何遇到此问题并且不确定的人 - 此'define_index'语法适用于v3之前的Thinking Sphinx版本。 – pat 2015-08-26 14:55:32

2

sphinx v 3语法:

ThinkingSphinx::Index.define :country, name: "my_first_in", with: :active_record 
    indexes name 
end 
+0

你能指定Sphinx新版本的版本号吗? – dvhh 2015-08-26 01:30:16

+0

这是v3以后的语法 – pat 2015-08-26 14:54:43