Мне удалось решить мою небольшую проблему, решений многократно
Как предложено @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>