【发布时间】:2013-07-06 01:52:12
【问题描述】:
有没有办法使用 Tire gem 从 ES 索引中批量删除文档?
有一种方法可以批量导入,但是删除呢?
批量导入示例:
articles = Article.where("id < 10")
Tire.index 'articles' do
import articles
end
【问题讨论】:
标签: ruby elasticsearch tire
有没有办法使用 Tire gem 从 ES 索引中批量删除文档?
有一种方法可以批量导入,但是删除呢?
批量导入示例:
articles = Article.where("id < 10")
Tire.index 'articles' do
import articles
end
【问题讨论】:
标签: ruby elasticsearch tire
是的,有一种方法可以删除。但是,这应该基于一些标准来完成。
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
这其实是用了elasticsearch的delete by query api。
【讨论】:
有一种更清洁的方法:
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
【讨论】: