Удалить дополнительную запись из целевого индекса при копировании из исходного индекса с помощью эластичного поискового запроса - PullRequest
0 голосов
/ 19 сентября 2018

Я работаю с эластичными поисковыми запросами, где у меня возникла проблема, такая как копирование записей из одного индекса в другой индекс с тем же отображением и типом.Но индекс1 (источник) имеет меньше записей (например, 2), чем индекс2 (пункт назначения: 3).Теперь мое требование состоит в том, чтобы скопировать записи из исходного индекса в индекс Dest, и эту дополнительную запись (id: 3) в целевом индексе следует удалить.Я сделал несколько следов, используя запрос reindex вasticsearch, но он мне не помог.

Любая помощь приветствуется ..

1 Ответ

0 голосов
/ 19 сентября 2018

Должны быть лучшие / более простые способы сделать это с помощью безболезненных сценариев, но это то, что я еще не пробовал.

Опять же, я предполагаю, что ваши документы не содержат никакого поля timestamp , которое отслеживает, когда документ был создан / обновлен, в противном случае вы можете выполнить Delete By Query API с использованием метки времени, после переиндексации от источника к месту назначения.

В приведенной ниже методике используются функции Ingest API и Reindex asticsearch

Допустим, у вас есть

  • исходный индекс - indexA
  • dest index - indexB

Создать два конвейера загрузки

PUT _ingest/pipeline/pipeline_one
{
  "description" : "pipeline from indexB to intermediate index",
  "processors" : [
    {
      "set" : {
        "field": "tempField",
        "value": "default"
      }
    }
  ]
}

PUT _ingest/pipeline/pipeline_two
{
  "description" : "pipeline from indexA to intermediate index",
  "processors" : [
    {
      "set" : {
        "field": "tempField",
        "value": "update"
      }
    }
  ]
}

Переиндексировать из indexB во временный indexC.

POST _reindex
{
    "source": {
        "index": "indexB"
    },
    "dest": {
        "index": "indexC",
        "pipeline": "pipeline_one"
    }
}

Переиндексировать из indexA во временный indexC

POST _reindex
{
    "source": {
        "index": "indexA"
    },
    "dest": {
        "index": "indexC",
        "pipeline": "pipeline_two"
    }
}

Таким образом, теперь вы знаете, что документы, которые не являютсяможно удалить, выполнив удаление по запросу, и если значение tempField по-прежнему по умолчанию .

POST indexc/_delete_by_query
{
  "query": {
    "match": {
      "tempField": "default"
    }
  }
}

На данный момент вы можете пойти дальше и удалить индекс назначения.

Пересоздайте индекс назначения (сначала сделайте резервную копию) и создайте нижеследующий конвейер для использования от промежуточного индекса до места назначения, а также удалите поле tempField, чтобы сохранить ваше отображение.

PUT _ingest/pipeline/pipeline_three
{
  "description" : "pipeline from intermediate to destination index",
  "processors" : [
    {
      "remove" : {
        "field": "tempField"
      }
    }
  ]
}


POST _reindex
{
    "source": {
        "index": "indexC"
    },
    "dest": {
        "index": "indexB",
        "pipeline": "pipeline_three"
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...