ruby-on-rails - rails/太阳黑子/Solr : Duplicate indexing on inherited classes

标签 ruby-on-rails search inheritance solr sunspot

我们正在构建一个使用 Solr 作为搜索引擎的 Ruby on Rails 应用程序。以下版本号可能与下一段中描述的问题相关:

  • ruby :1.9.2
  • rails :3.2.6
  • 太阳黑子:1.3.0.rc5

背景

我们有一个被不同子类继承的Feedback模型。类层次结构如下所示(单表继承):

Feedback
  |- Problem
  |- Question
  |- Suggestion
  |- Announcement

Feedback 模型中索引由以下代码启用:

searchable :auto_index => true, :auto_remove => true do
  string :type
  text :title, :boost => 2
  text :content
  integer :user_id
  time :created_at
  ...
end

问题

这个问题是,例如,当创建一个标题为“problemtitle”的新 Problem 时,Sunspot 会初始化 Problem 的自动索引 底层反馈。搜索标题为“problemtitle”的反馈时

search = Feedback.solr_search do
    with(:type, type.capitalize)
    fulltext("problemtitle") {minimum_match 1}
    paginate(page: options[:page], per_page: options[:per_page])
end

找到两个结果。一个结果是问题,另一个是反馈。这表明在类层次结构中,一个类及其子类被索引;据我所知,这应该是正确的。

这里奇怪的是,使用命令 bundle exec rake sunspot:solr:reindex 重新索引索引并搜索标题为“problemtitle”的Feedback 会得到一个结果是上面创建的问题

我们通过添加 :unless => proc {|model| 来解决这个问题model.class == FeedbackFeedback 模型中的可搜索定义。这确保只有 Feedback 的子类被自动索引。

问题

我的问题是这是否是一种期望的行为(它是一个特性还是一个错误)。我不明白为什么重新索引对模型的索引与创建时的自动索引不同。这可能是我们如何实现类层次结构的问题吗?

如果需要更多信息来回答我的问题,我会尽量提供。

谨致问候,

塞巴斯蒂安

最佳答案

Sebastian,我认为这里的问题是 Sunspot 使用完整的类名和 ID 创建了一个 Solr 主 ID:

def index_id_for(class_name, id) #:nodoc:
  "#{class_name} #{id}"
end

因此,如果您的类被索引为 Feedback 然后又被索引为 Feedback::Problem Solr 将有两个条目,因此在搜索时返回它们.然后 Sunspot 将尝试将每一个与数据库进行匹配,两次提取相同的项目。重建索引时,整个数据库将被删除,并且每个项目都使用其当前类编制索引 - 这就是重建索引后只有一个的原因。

我们遇到了类似的问题,解决方案是为 STI 类创建我们自己的 InstanceAdapter 并将其注册到初始化程序中:

class StiInstanceAdapter < Sunspot::Adapters::InstanceAdapter

  def id
    @instance.id
  end

  def index_id
    return Sunspot::Adapters::InstanceAdapter.index_id_for(@instance.class.base_class.name, id)
  end

end

Sunspot::Adapters::InstanceAdapter.register(StiInstanceAdapter, Feedback)

我知道这有点晚了,但希望它能有所帮助。

关于ruby-on-rails - rails/太阳黑子/Solr : Duplicate indexing on inherited classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14832938/

相关文章:

html - 我上传到我的 ruby​​-on-rails 服务器的照片看起来很糟糕

search - 使用“stop”时,在Elasticsearch中“_all”过滤器的行为有所不同

具有多个过滤器的图像搜索

c++ - boost::sp_convertible 的解释

java - 如何从两个库类继承?如果不可能,有什么替代方案?

ruby-on-rails - 访问存储在使用 #create_join_table 创建的连接表中的连接模型属性

mysql - Rails 3 SQL 查询选择与连接

search - 简单的文件文本搜索工具?

java - Java中父类函数的访问

ruby-on-rails - 验证或不验证 bool 字段