Solr 批量创建索引

第一种

Project.find_in_batches do |group|
  Sunspot.session.index(group)
end
Sunspot.session.commit

一次提交,但是会生成很多 has_manySQL, 创建索引还是很慢

比如生成的SQL:

ProjectSubcatVal Load (7.8ms)  SELECT "PROJECT_SUBCAT_VALS".* FROM "PROJECT_SUBCAT_VALS" WHERE "PROJECT_SUBCAT_VALS"."PROJECT_ID" = :a1 AND "PROJECT_SUBCAT_VALS"."IS_NEW" = :a2  [["project_id", 35899], ["is_new", 0]]

*分析原因,慢在SQL查询上,减少 n+1 查询, 一次查询*

第二种

把 solr searchable 中用到的 has_many 表先 includes 进来

  Project.includes(:subcat_vals, :project_new_subcat_vals, :project_subcat_vals, :firmtenders, :tenders, :city, :project_cat_floors).find_in_batches do |group|
    Sunspot.session.index(group)
  end
  Sunspot.session.commit

在查询数据库层面减少了 SQL 查询,速度快了很多

总结

solr创建索引分为几步

  • 数据库查询数据
  • SOLR 创建索引
  • SOLR 事务提交