是否可以拆分多值动态字段?
架构:
<dynamicField name="*_s" type="string" indexed="true" stored="true" multiValued="true"/>
DIH-配置:
<field column="*_s" splitBy="\|" />
它似乎不起作用。任何帮助都是适当的!
更新灵感来自评论
<dataConfig>
<dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://${dataimporter.request.sqlserver};databaseName=${dataimporter.request.sqlcatelog};responseBuffering=adaptive;"
user="${dataimporter.request.sqluser}"
password="${dataimporter.request.sqlpassword}"
readOnly="true" batchSize="500"/>
<script><![CDATA[
function SplitDynamicColumn(row, context) {
var fields = context.getAllEntityFields();
// find dynamic columns with 'splitBy' rule
for (var f = 0; f < fields.size(); f++) {
var field = fields.get(f);
var columnMask = field.get('column');
if (columnMask.contains('*') && field.containsKey('splitBy')) {
var columnNameRegex = columnMask.replace('*', '\\w+');
var columns = row.keySet().toArray();
// find columns that match mask
for (var c = 0; c < columns.length; c++) {
var columnName = columns[c];
if (columnName.matches(columnNameRegex)) {
// split column value
var value = row.get(columnName);
if (value !== null) {
var arr = new java.util.ArrayList();
var sp = value.split(field.get('splitBy'));
for (var i = 0; i < sp.length; i++) {
arr.add(sp[i]);
}
row.put(columnName, arr);
}
}
}
}
}
return row;
}
]]></script>
<document name="pages">
<entity name="pages" transformer="RegexTransformer,script:SplitDynamicColumn" query="EXEC A_STORED_PROCEDURE">
<field column="*_s" splitBy="\|" />
</entity>
</document>
</dataConfig>
答案 0 :(得分:1)
splitBy是RegexTransformer的标志。确保您在该实体上有the transformers套。
然而,更重要的是,我不相信DIH会像你定义的那样支持通配符。 DIH通过尝试将字段名称与模式名称匹配来支持通配符映射,但这不允许您定义任何转换。
您可能无法将这两个功能组合在一起。解决这个问题的一种方法是编写自己的自定义转换器,该转换器不需要运行属性的定义。