Solr 批量创建索引
Solr
批量创建索引
第一种
Project.find_in_batches do |group|
Sunspot.session.index(group)
end
Sunspot.session.commit
一次提交,但是会生成很多 has_many
的 SQL
, 创建索引还是很慢
比如生成的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 事务提交