【问题标题】:ElasticSearch Tire: How to bulk remove?ElasticSearch 轮胎:如何批量删除?
【发布时间】:2013-07-06 01:52:12
【问题描述】:

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

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

批量导入示例:

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


Tire.index 'articles' do 
     import articles
end

【问题讨论】:

    标签: ruby elasticsearch tire


    【解决方案1】:

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

    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。

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2013-09-26
        • 2013-07-23
        • 2014-10-24
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        • 1970-01-01
        相关资源
        最近更新 更多