我最初的目的是将一个表中的多个列映射到solr中的一个字段,而不知道列的确切名称。 这可以提供将从实体查询获取的所有查询结果列映射到一个字段的机会,例如所有具有text(或varchar)类型的列。
我正在使用DataimportHandler从sql server导入数据。数据源配置没有问题,因为使用列名和依赖字段名称的直接映射可以正常工作。 例如,使用
<entity name="foo" dataSource="my_database" query="select * from foo">
<field column="db_column_name" name="solr_field_name"/>
</entity>
经过几个小时的尝试和搜索后,我最终定义了一个额外的MappingTable,其中包含要映射的所有列名和字段,如下所述 Solr - DataImportHandler: When attempting to use column values as field names, multivalued fields only retain the first result
MappingTable看起来像
SOLR_FIELD MY_FIELD
name column_name
id column_id
content column_desc
content column_second_desc
SourceTable看起来像
column_id column_name column_desc
123 goose this column doesnt quak
342 plain this is another description
此表之间没有定义外键。 所以我想在这里做的另一件事就是使用MappingTable从SourceTable中获取每一行的数据并将其放入solr字段,而不用明确命名Code中的Sourcetable的列名(创建额外表的可能性仍将保持进程)足够动态。
此示例显示了我如何尝试实现映射
<entity name="source" dataSource="my_database" query="SELECT * FROM SourceTable">
<entity name="mapping" query="select * from MappingTable" transformer="ClobTransformer" >
<field name="${mapping.SOLR_FIELD}" column="MY_FIELD" clob="true" />
</entity>
</entity>
正如您所看到的,这只会返回四个文档,这些文档包含单词column_name,column_id,column_desc,column_second_desc,与我在SourceTable中找到的solr数据集一样频繁。
之后我尝试转换术语并使用column =“$ {mapping.MY_FIELD}”来动态获取MappingTable中的列名。
<entity name="mapping" query="select * from MappingTable" transformer="ClobTransformer" >
<entity name="source" dataSource="my_database" query="SELECT * FROM SourceTable>
<field name="${mapping.SOLR_FIELD}" column="${mapping.MY_FIELD}"/>
</entity>
</entity>
但这对我不起作用。 Solr没有执行/ dataimport?command = full-index既没有在solr admin的“Logging”部分给我提示。
也许有可能使用表中的外键来实现这一点。 我还考虑过使用ScriptTransformer接近它并查看Dynamic column names using DIH (DataImportHandler)中的答案,但这只显示了实现动态自定义solr字段的方法,并且这也假设用户知道源列名。 所以我尝试了一种类似于In solr dih import two double in one location
中解释的内容<script><![CDATA[
function catchColumns(row) {
var descriptions = new java.util.ArrayList();
for (var i=0; i<row.length; i++) {
var value = row[i];
if (value.equals(String))
{
descriptions.add(row[i]);
}
}
row.put("description",descriptions);
return row;
} ]]></script>
使用简单的实体定义
<entity name="foo"
dataSource="my_database"
transformer="script:catchColumns"
query="select * from foo">
...
</entity>
但我猜ScriptTransformer仅适用于实体中字段标记中的命名列。
我希望有人可能会发现错误或为我提供更好的方式。
编辑:缺少一些引号,只是在更改示例的名称和查询时发生这种情况。 我也尝试修复一些blury措辞段落。