在Solr数据导入处理程序中拆分多值动态字段

时间:2013-05-26 10:48:56

标签: dynamic solr field dataimporthandler

是否可以拆分多值动态字段?

架构:

<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>

1 个答案:

答案 0 :(得分:1)

splitBy是RegexTransformer的标志。确保您在该实体上有the transformers套。

然而,更重要的是,我不相信DIH会像你定义的那样支持通配符。 DIH通过尝试将字段名称与模式名称匹配来支持通配符映射,但这不允许您定义任何转换。

您可能无法将这两个功能组合在一起。解决这个问题的一种方法是编写自己的自定义转换器,该转换器不需要运行属性的定义。