2012-01-18 9 views
0

私は、次のフィールドがあります:私はカンマ区切りのint、nullまたは空の文字列のリストであるフィールドproperty_industry_sectorを持っているデータベースではSolrのScriptTransformerの戻り値

  • を。 Solrのスキーマ構成で
  • 私は多値 int型タイプの同じフィールドproperty_industry_sectorを持っています。

私の問題は、私はDataImportHandlerの構成の違いに対処しなければならないということです、そして私の試みは、次のようになります。

function SplitIndustrySector(row) { 
    //var logger = java.util.logging.Logger.getLogger("org.apache.solr"); 

    if(row.get('property_industry_sector') !== null) { 
    if(false === row.get('property_industry_sector').isEmpty()) { 

     var pieces = row.get('property_industry_sector').split(','); 
     var arr = new java.util.ArrayList(); 
     for(var i=0, len=pieces.length; i<len; i++) { 
     arr.add(new java.lang.Integer(pieces[i])); 
     } 

     row.put('property_industry_sector', arr); 
     return row; 
    } 
    } 

    var arr = new java.util.ArrayList(); 
    arr.add(new java.lang.Integer(0)); 
    row.put('property_industry_sector', arr); 
    return row; 
} 

ScriptTransformerは次のように定義されている

<entity 
    name="property_industry_sector_extractor" 
    transformer="script:SplitIndustrySector" 
    query=" 
     SELECT property_industry_sector 
     FROM job 
     WHERE job.id = ${job.id} 
    "> 
    <field column="property_industry_sector" name="property_industry_sector" /> 
    </entity> 

を問題は、変圧器が何であるかに関わらず、値がnullまたは空の文字列の場合、一般的な場合です。次の例外が表示されます。

property_industry_sector=property_industry_sector(1.0)={[, 0]}}] 
java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:493) 
    at java.lang.Integer.parseInt(Integer.java:514) 
    at org.apache.solr.schema.TrieField.createField(TrieField.java:374) 
    at org.apache.solr.schema.SchemaField.createField(SchemaField.java:97) 
    at org.apache.solr.update.DocumentBuilder.addField(DocumentBuilder.java:203) 
    at org.apache.solr.update.DocumentBuilder.toDocument(DocumentBuilder.java:276) 
    at org.apache.solr.update.processor.RunUpdateProcessor.processAdd(RunUpdateProcessorFactory.java:60) 
    at org.apache.solr.handler.dataimport.SolrWriter.upload(SolrWriter.java:73) 
    at org.apache.solr.handler.dataimport.DataImportHandler$1.upload(DataImportHandler.java:294) 
    at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:631) 
    at org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:267) 
    at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:186) 
    at org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:353) 
    at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:411) 
    at org.apache.solr.handler.dataimport.DataImporter$1.run(DataImporter.java:392) 

空の文字列がどこから来るのか私は理解していないにもそれは例外の上に挿入しようとした値に惑わされながら(それは整数に変換しようとしている):私はしました

property_industry_sector=property_industry_sector(1.0)={[, 0]}}] 

put()コールの前に行を消去しようとしました。 nullを返します。または、現在の例と同様に、単一の値が0の行を返します。

答えて

1

解決方法は見つかりませんでしたが、別の解決方法で問題を解決することができました。 ScriptTransformerを使用する代わりに、私はSQL変換で同じ目標を達成することができました。

<entity name="industry_sector_hack" query=' 
    SELECT property_industry_sector AS property_industry_sector_ids 
    FROM job 
    WHERE id = ${job.id} AND 
      property_industry_sector IS NOT NULL AND 
      property_industry_sector &lt;&gt; "" 
    '> 
    <entity name="property_industry_sector" query=' 
     SELECT property.id AS property_industry_sector 
     FROM property 
     WHERE property.id IN (${industry_sector_hack.property_industry_sector_ids}) 
    '> 
    <field column="property_industry_sector" name="property_industry_sector" /> 
    </entity> 
</entity>