与Rails 3.2一起使用acts_as_paranoid gem集成Elasticsearch

时间:2013-12-26 11:01:39

标签: ruby-on-rails ruby elasticsearch

我正在尝试从Elasticsearch结果中过滤掉所有已删除的记录(使用偏执宝石https://github.com/goncalossilva/acts_as_paranoid)。

acts_as_paranoid是软删除,此gem将覆盖我们模型的destroy方法,它在我们的模型中添加了列名deleted_at (datetime),如果此记录不是'n'则设置为nil'删除。 在Elasticsearch中,我想过滤掉(所有删除的记录都不应该出现在 搜索结果),但我仍然得到它们。

这是我在elasticsearch中的代码:

  tire.search(load: true, page: params[:page], per_page: per_page) do
    query do
      boolean do
        must { term: {"deleted_at": nil} }
      end
      filter :range, created_at: {gte: params[:created_after]} if params[:created_after]
      filter :term, city: CITIES[params[:city]] unless CITIES[params[:city]].blank?
      sort do
        by :created_at, "desc"
      end
     end
   end

我也试过放filter :missing, field: :deleted_at

但它无法正常工作。 请告诉我我的错误是什么,我该如何解决?它让我疯狂@@

2 个答案:

答案 0 :(得分:1)

首先要研究的是:

字段deleted_at索引了吗?

如果是,您的过滤器解决方案应该可以使用

  1. 使用deleted_at清理所有文档,然后只要有软删除就必须从elasticsearch清理文档

  2. 您需要在索引中添加deleted_at,然后使用此过滤器。

  3. 如果你想进入第1步,你可以使用这段代码:

    我发现您使用轮胎ruby客户端连接到elasticsearch:

    获取已将deleted_at设置为nil的文档的ID

    类似下面的代码应该可以工作

    <Modelname>.all.map {|i| i.id if !usr.deleted_at.nil?}.compact #This is just an example no tests have been run to test the performance to fetch thousands of records. 
    

    你可以使用别的东西。您只需要获取已将deleted_at设置为nil的文档的ID

    然后使用以下代码从elasticsearch中删除这些文档。

    id_array = [1,2,3]
    query = Tire.search do |search|
            search.query { |q| q.terms :_id, id_array }
          end
    
    index = Tire.index('<index_name>') # provide the index name as you have in your code
    
    Tire::Configuration.client.delete "#{index.url}/_query?source=#{Tire::Utils.escape(query.to_hash[:query].to_json)}"
    

    完成此操作后,只要有软删除,就必须使用相同的代码。您可以在数组中发送单个ID,而不是数组,也可以使用术语过滤器而不是术语来发送单个ID

    对于单个文档:

    id_no = 1
    query = Tire.search do |search|
            search.query { |q| q.term :_id, id_no }
          end
    
    index = Tire.index('<index_name>') # provide the index name as you have in your code
    
    Tire::Configuration.client.delete "#{index.url}/_query?source=#{Tire::Utils.escape(query.to_hash[:query].to_json)}"
    

    如果您想要进入第2步,请在to_indexed_json中添加deleted_at,然后重新编制数据索引,然后使用过滤器。

答案 1 :(得分:0)

您可以先删除索引并再次创建,在使用软删除之前,您的数据可能会受到索引的影响。

第1步:删除索引

bundle exec rake environment tire:index:drop force=true INDICES=<index_name>

第2步:再次创建索引

bundle exec rake environment tire:import:all force=true

使用http://localhost:9200/_aliases检查<index_name>(INDICES的值)