Статьи

Индекс данных из реляционной базы данных в Elasticsearch — 1

Elasticsearch предоставляет мощные возможности поиска с поддержкой шардинга и репликации данных. Поэтому мы хотели бы проиндексировать данные, доступные в нашей БД, в Elasticsearch.

Есть несколько способов индексировать данные в Elasticsearch:

  1. Используйте Logstash для установки источника в качестве БД и приемника в качестве Elasticsearch и используйте фильтр, если требуется для создания объекта JSON.
  2. Используйте внешнюю библиотекуasticsearch -jdbc, которая в своем собственном процессе работает вне экземпляра Elasticsearch. Он использует транспортный клиент и его массовые API для индексации данных в Elasticsearch.

В этой статье мы рассмотрим подход 2, то есть использование внешней библиотеки, работающей как отдельный процесс.

Мы будем использовать MySQL в качестве БД и использовать пример мира баз данных , который поставляется с MySQL, со следующими таблицами:

  • страна
  • город
  • countrylanguage

Библиотека Elasticsearch-jdbc поддерживает до Elasticsearch 2.3.4 с матрицей совместимости, доступной на их странице GitHub. Во-первых, давайте индексируем данные без предварительного определения структуры индекса в Elasticsearch (ES). Если мы не предоставляем структуру индекса, ES выводит и строит ее на основе индексированных данных. Но это не всегда будет идеальная структура.

Создать пустой индекс

Убедитесь, что ES работает. Если вы работаете в Windows, перейдите в каталог bin ES и запуститеasticsearch.bat. Если вы работаете в Linux, следуйте инструкциям здесь .

Чтобы создать пустой индекс, вы должны выполнить HTTP POST для <es_url>: <port> / <index_name>. Например, используя cURL:

1
curl -X POST localhost:9200/world

Вы даже можете использовать клиенты REST по вашему выбору, такие как Postman, для вызова API ES REST

Настройка JDBC Importer

Загрузите двоичный файл e lasticsearch-jdbc и распакуйте его в папку, назовем его ES_IMPORTER. В ES_IMPORTER / bin уже есть скрипты для работы с MySQL и другими БД, и мы поместим все скрипты, связанные с импортом, в одну папку.

Примечание . Если вы используете Oracle DB, вам нужно поместить драйвер JDBC в папку ES_IMPORTER / lib. Для других БД, таких как MySQL, драйверы PostgreSql JDBC уже доступны.

Другое примечание :asticsearch-jdbc требует JDK 8

Мы создадим следующие файлы (код доступен по ссылкам) для запуска средства импорта:

  • world-importer.bat / world-importer.sh — используется для запуска импортера
  • world-importer-config.json — используется для настройки импортера
  • world.sql — содержит SQL-запрос, который необходимо выполнить для получения данных для индексации.

Строка соединения JDBC, имя пользователя БД и пароль могут быть обновлены в world-importer-config.json . Кроме того, порт ES, имя хоста ES, имя индекса ES, имя типа индекса ES можно обновить в том же файле.

Запуск импортера JDBC

Перед запуском импортера откройте URL: http: // localhost: 9200 / world

Выше показано, что мир индекса не имеет определенной структуры

Откройте URL: http: // localhost: 9200 / world / _search

Выше показано, что в мире индексов нет данных.

Перейдите в каталог: ES_IMPORTER / bin и запустите world-importer.bat ИЛИ world-importer.sh .

Когда импортер завершит работу, что должно произойти почти сразу, откройте URL: http: // localhost: 9200 / world / . Теперь вы увидите, что индекс имеет структуру, которая также называется отображениями, определенными в ключе отображений . И когда вы откроете URL: http: // localhost: 9200 / world / _search, вы найдете проиндексированные данные, которые будут содержать около 239 записей, как указано в поле попаданий .

Преимущества JDBC Importer

  • Легко импортировать данные, доступно множество вариантов конфигурации. И может быть запланировано запустить несколько раз.
  • Поддерживает создание вложенных объектов и массивов вложенных объектов (в нашем примере столица — это вложенный объект, а города и языки — это массивы вложенных объектов)
  • SQL-запросы могут быть параметризованы
  • Только данные, измененные после последнего запуска, могут быть переиндексированы.

Недостатки JDBC Importer

  • Нет поддержки ES версии 5 и выше
  • Существует возможность дублирования объектов в массиве вложенных объектов. Но дедупликация может быть обработана на прикладном уровне.
  • Возможна задержка поддержки последних версий ES.

В следующей части этой статьи мы будем:

  • Создайте сопоставления для индекса
  • Понять SQL, используемый для индексации