Решите DataImportHandler, используя MySQL в качестве источника - имея дело со столбцами типа json - PullRequest
0 голосов
/ 11 января 2020

У меня есть MySQL база данных с данными, собранными из некоторых процессов сканирования, теперь я хотел бы реплицировать данные в ядре solr, чтобы дать им лучшую структуру и возможность выполнять определенный поиск по ним.

Я смог использовать DataImportHandler на своем ядре, сконфигурировав схему необработанных данных. xml Схема для импорта некоторых столбцов в одной таблице, но перед тем, как начать работать с другие связанные сущности, которые я должен выяснить, как решить простую проблему.

Во многих моих SQL таблицах у меня есть несколько столбцов, где данные хранятся с использованием MySQL s JSON тип (да, я должен был использовать no- sql с самого начала)

Пример данных

{
  "slug": "sample-item-slug",
  "Released": "2008",
  "Platforms": "Nintendo DS, PSP",
  "DevelopedBy": "Sample Developer",
  "PublishedBy": "Sample Publisher"
}

Я хотел бы иметь возможность импортировать ключи в объекте json как поля моего документа SOLR.

Как это можно сделать? Я смотрел на Трансформаторы , но, похоже, что для этой цели нет спецификаций c ...

Может кто-нибудь подскажет мне некоторые предложения?

Заранее спасибо.

1 Ответ

1 голос
/ 12 января 2020

Мне удалось решить мою небольшую проблему, решений многократно

Использование ScriptTransformer

Как предложено @MatsLindh, вероятно, лучший способ для случаев, когда поля в столбец JSON - это Dynami c, то есть использовать функцию javascript для преобразования данных столбца, разбирая его как строку JSON и повторяя полученный объект для добавления строк в данные столбца.

Пример функции из ScriptTransformer

function splitMetadata(row) {
  var metadata;
  metadata = JSON.parse(row.get('metadata'));
  if (metadata) {
    Object.keys(metadata).map(function(key, index) {
  row.put(key,metadata[key]);
    });
  }
  return row;
}

Как говорит Solr Docs , переменная row, переданная в функцию, имеет тип Java Map<String,Object>, поэтому вы можете легко добавить в нее данные, используя get,put,remove.

Пример data-config.xml с использованием ScriptTransformer

Исходя из модели данных, указанной в вопросе, обратите внимание, что я также использовал RegexTransformer, чтобы разбить строку на несколько значений, используя указанный разделитель.

<entity name="metadata" query="select metadata from games" transformer="RegexTransformer,script:splitMetada">
    <field column="slug" name="attr_platforms" splitBy=" ," />
    <field column="Platforms" name="attr_platforms" splitBy=" ," />
    <field column="Released" name="release_date_dt" />
    <field column="DevelopedBy" name="developer_s" />
    <field column="DevelopedBy" name="publisher_s" />
</entity>

Использование MySQL Inline Path Operator ->>

Если у вас есть фиксированное количество клавиш json в вашем столбце, вы можете просто выбрать их, используя MySQL Inline P Ат Оператор , для выбора указанных ключей в столбцах JSON, например:

Пример MySQL Запрос

На основе модели данных, указанной в вопросе

SELECT
metadata->>'$.Released' AS release_date,
metadata->>'$.Platforms' AS platforms,
metadata->>'$.DevelopedBy' AS developer, 
metadata->>'$.PublishedBy' AS publisher  
FROM games WHERE id='${game.ID}'

В качестве решения ScriptTransformer вы можете объявить столбец metadata (тот, который содержит JSON в моем случае) как <entity> в вашем файле data-config.xml и обрабатывать его как объединенную таблицу. также создайте view в вашей БД, чтобы избежать записи запроса в XML

Образец data-config.xml с использованием MySQL query

На основе запроса, указанного выше

<entity name="metadata" query="select metadata->>'$.Released' as release_date,metadata->>'$.Platforms' as platforms,metadata->>'$.DevelopedBy' as developer, metadata->>'$.PublishedBy' as publisher  FROM games where id='${game.ID}'">
   <field column="release_date" name="release_date_dt" />
   <field column="platforms" name="attr_platforms" />
   <field column="developer" name="developer_txt" />
   <field column="publisher" name="publisher_txt" />
</entity>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...