2012-01-18 4 views
0

나는 다음과 같은 필드가 : 데이터베이스에서SOLR ScriptTransformer 반환 값

  • 내가 쉼표로 구분하는 int, null 또는 빈 문자열의 목록입니다 분야 property_industry_sector을 가지고 있습니다.
  • Solr 스키마 구성에서 다중 값의 동일한 필드 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>