ElasticSearch轮胎:如何批量删除?

时间:2013-07-06 01:52:13

标签: ruby elasticsearch tire

有没有办法用Tire gem批量删除ES索引中的文档?

有一种批量导入的方法,但是删除呢?

批量导入示例:

articles = Article.where("id < 10")


Tire.index 'articles' do 
     import articles
end

2 个答案:

答案 0 :(得分:2)

是的,有一种方法可以删除。但是,这应该基于某些标准来完成。

id_array = [array of ids to be removed]
query = Tire.search do |search|
        search.query { |q| q.terms :_id, id_array }
      end

index = Tire.index(index_alias)

Tire::Configuration.client.delete "#{index.url}/_query?source=#{Tire::Utils.escape(query.to_hash[:query].to_json)}"

参考:https://github.com/karmi/tire/issues/309

这实际上使用了弹性搜索的查询api删除。

答案 1 :(得分:2)

有一种更清洁的方式:

Article.index.bulk :delete, documents, refresh: true

documents是一个JSON数组。要在Elasticsearch中执行批量删除,只需包含_index_type_id字段就足够了。在我们的例子中,_index将从模型名称中推断出来,因此我们只需要传递其他两个。

总结一下:

documents = articles_to_delete.map { |a| { _type: 'article', _id: a.id } }
Article.index.bulk :delete, documents, refresh: true