Solr ScriptTransformer возвращаемое значение - PullRequest
0 голосов
/ 18 января 2012

У меня есть следующие поля:

  • В базе данных у меня есть поле property_industry_sector, представляющее собой список целых чисел, разделенных запятыми, пустой или пустой строки .
  • В конфигурации схемы Solr у меня есть такое же поле property_industry_sector типа int и многозначное .

Моя проблема в том, что я должен учитывать разницу в конфигурации DataImportHandler, и моя попытка выглядит следующим образом:

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

Где ScriptTransformer имеет следующее определение:

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

Проблема в общем случае, когда значение равно нулю или пустой строке, потому что независимо от того, что делает преобразователь, я все равно получаю следующее исключение

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)

Я не понимаю, откуда взялась пустая строка (которую она пытается преобразовать в Integer), хотя она также путается со значениями, которые она пытается вставить над исключением:

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

Я пытался очистить строку перед вызовом put(). Вернуть null, или так же, как в текущем примере, вернуть строку с одним значением 0.

1 Ответ

1 голос
/ 19 января 2012

Не нашел способа решить это, но сумел решить проблему с помощью альтернативного решения.Вместо использования 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>
...