我正在尝试从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
但它无法正常工作。 请告诉我我的错误是什么,我该如何解决?它让我疯狂@@
答案 0 :(得分:1)
首先要研究的是:
字段deleted_at索引了吗?
如果是,您的过滤器解决方案应该可以使用
使用deleted_at清理所有文档,然后只要有软删除就必须从elasticsearch清理文档
您需要在索引中添加deleted_at,然后使用此过滤器。
如果你想进入第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的值)