Elasticsearch: проблемы с переиндексацией — в итоге получается более одного типа

ES 6.8.6 Я пытаюсь переиндексировать некоторые индексы, чтобы уменьшить количество осколков.

Исходный индекс имел тип «auth», но недавно я добавил шаблон, который использовал _doc. Когда я попытался:

curl -X POST "localhost:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
  "source": {
      "index": "auth_2019.03.02"
  },
  "dest": {
      "index": "auth_ri_2019.03.02",
      "type": "_doc"

  }
}
'

Я получаю эту ошибку:

"Rejecting mapping update to [auth_ri_2019.03.02] as the final mapping would have more than 1 type: [_doc, auth]"

Я понимаю, что у меня не может быть более одного типа, и эти типы устарели в 7.x. Мой вопрос: могу ли я изменить тип во время операции переиндексации.

Я пытаюсь все привести в порядок, готовясь к переходу на 7.x.


person Russell Fulton    schedule 05.08.2020    source источник
comment
Попробуйте установить type внутри dest как согласно документации   -  person leandrojmp    schedule 06.08.2020
comment
Спасибо!, на самом деле я пробовал это и, перечитывая документ, я вижу, что тип исходного индекса якобы игнорируется. Теперь возникает вопрос, где он мог получить тип «auth», который является типом из исходного индекса. Обновлю вопрос...   -  person Russell Fulton    schedule 06.08.2020
comment
Хммм... добавление type: auth to source заставило ошибку исчезнуть, и теперь я получаю пустой созданный индекс, но с правильной настройкой. Прогресс.   -  person Russell Fulton    schedule 06.08.2020
comment
Дох! есть веская причина, по которой индекс назначения был пуст. Таков был источник! Задача решена. Что мне нужно было сделать, так это добавить записи явного типа как для источника, так и для места назначения.   -  person Russell Fulton    schedule 06.08.2020


Ответы (2)


Во-первых, спасибо leandrojmp за то, что он побудил меня перечитать документы и заметил пример, в котором у них был указан тип как для источника, так и для места назначения.

Я не понимаю почему, но добавление типа в исходную спецификацию решило проблему.

Это сработало:

curl -X POST "localhost:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
  "source": {
      "index": "auth_2019.03.02",
      "type": "auth"
  },
  "dest": {
      "index": "auth_ri_2019.03.02",
      "type": "_doc"

  }
}
'
person Russell Fulton    schedule 06.08.2020

Похоже, вам нужно написать скрипт для изменения документа в процессе переиндексации.

Из документов,

Как и _update_by_query, _reindex поддерживает сценарий, который изменяет документ.

Вы действительно можете изменить type.

Подумайте о возможностях! Просто будь осторожен; вы можете изменить: _id, _type, _index, _version, _routing

Для вашего случая добавьте


  "script": {
    "source": "ctx._type = '_doc'",
    "lang": "painless"
  }

Полный пример

{
  "source": {
      "index": "auth_2019.03.02"
  },
  "dest": {
      "index": "auth_ri_2019.03.02",
  },
  "script": {
    "source": "ctx._type = '_doc'",
    "lang": "painless"
  },
}
person MCI    schedule 06.08.2020