ElasticSearch переиндексирует вложенное поле как новые документы - PullRequest
0 голосов
/ 20 сентября 2018

В настоящее время я изменяю свою схему ElasticSearch.Ранее в моем индексе был один тип Product с вложенным полем Product.users.И теперь я хочу получить 2 разных индекса, один для Product, другой для User и сделать ссылки между ними в коде.

Я использую reindex API для переиндексации всех моих Productдокументы в новый индекс, удаляя поле Product.users, используя скрипт:

ctx._source.remove ('users');

Но я не знаюКак переиндексировать все мои Product.users документы в новый индекс User, как в сценарии, я получу ArrayList users, и я хочу создать один User документ для каждого.

Кто-нибудьзнает, как этого добиться?

Ответы [ 3 ]

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

То, что вам нужно, называется ETL (Извлечение, Преобразование, Загрузка).

В большинстве случаев удобнее написать небольшой скрипт на Python, который делает именно то, что вам нужно, но с упругим поискомэто то, что мне нравится: плагин Apache Spark +asticsearch4hadoop.

Кроме того, иногда logstash может добиться цели, но с Spark у вас есть:

  • синтаксис SQL или поддержка Java / Scala / Pythonкод
  • очень быстрый поиск и запись в эластичном поиске / записи, потому что распределенный рабочий (1 осколок ES = 1 рабочий Spark)
  • отказоустойчивый (сбой рабочего - нет проблем)
  • кластеризация (идеальноесли у вас есть миллиард документов)

Используйте с Apache Zeppelin (ноутбук с Spark в упаковке и готов), вам понравится!

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

Самое простое решение, которое я могу придумать, - это запустить команду reindex дважды.После выбора полей Product и повторной индексации в индексе newProduct и один раз для пользователя:

POST _reindex
{
  "source": {
    "index": "Product",
    "type": "_doc",
    "_source": ["fields", "to keep in", "new Products"]
    "query": {
        "match_all": {}
    }
  },
  "dest": {
    "index": "new_Products"
  }
}

Тогда вы сможете снова выполнить переиндексацию в таблице new_User, выбрав Product.users только в2-й переиндекс

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

Для тех, кто может столкнуться с такой ситуацией, я, наконец, переиндексировал вложенное поле users, используя API scroll и bulk.

  • Я использовал scroll API для получения пакетовиз Product документов
  • Для каждого пакета итерация по этим Product документам
  • Для каждого документа итерация по Product.users
  • Создание нового User документа и добавлениеэто к массе
  • По окончании итерации итерируем по Product пакет

Выполнение задания <3 </p>

...