Интегрированный поиск Elastics с act_as_paranoid gem с Rails 3.2

Я пытаюсь отфильтровать все удаленные записи (используя paranoid gem https://github.com/goncalossilva/acts_as_paranoid) из результата Elasticsearch.

acts_as_paranoid - это мягкое удаление, этот камень будет переопределять метод destroy для нашей модели, он добавил имя столбца deleted_at (datetime) в нашей модели и установил 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 ответа

Сначала вы можете отбросить индекс и создать его снова, возможно, ваши данные пострадали от индекса перед использованием мягкого удаления.

ШАГ 1: падение индекса

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

ШАГ 2: снова создайте индекс

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

Использование http://localhost:9200/_aliases для проверки на (значение INDICES)


Первое, что нужно изучить:

Является ли поле deleted_at индексированным?

Если да, то ваш фильтр должен работать, иначе

  1. Очистите все документы с помощью delete_at, а затем вы должны очистить документ от elasticsearch всякий раз, когда есть мягкое удаление

  2. вам нужно добавить delete_at в индекс, а затем использовать этот фильтр.

Если вы хотите перейти к шагу 1, вы можете использовать этот фрагмент кода:

Я вижу, что вы используете шинный рубиновый клиент для подключения к elasticsearch:

Получите идентификаторы документов, которые удалили NOT, чтобы не установить нуль

что-то вроде приведенного ниже кода должно работать

<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.
</modelname>

Вы можете использовать что-то еще. Все, что вам нужно, это получить идентификаторы документов, которые удалены, а не установлены на ноль

Затем используйте приведенный ниже код, чтобы удалить эти документы из поиска elastics.

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)}"
</index_name>

Как только это будет сделано, вы должны использовать тот же код всякий раз, когда есть мягкое удаление. Вместо массива чисел вы можете просто отправить один идентификатор в массиве или использовать термин "фильтр" вместо терминов для отправки одного идентификатора

Для одного документа:

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)}"
</index_name>

Если вы хотите перейти к шагу 2, добавьте delete_at в свой файл to_indexed_json, а затем переиндексируйте свои данные, а затем используйте фильтр.

licensed under cc by-sa 3.0 with attribution.