SOLR: скопировать запись из второго поля, если 1-е поле пустое или недоступно - PullRequest
0 голосов
/ 25 февраля 2020

За этим следует вопрос: SOLR: как скопировать данные в другое поле с отфильтрованными значениями?

У меня есть эти типы значений в solr

"Price":"0.07 AUD"
"Price":"10.00"
"Price":"AUD"

Итак, я скопировал вышеупомянутые записи в другое поле, как показано ниже

"CustomPrice":0.07
"CustomPrice":10.00
"CustomPrice": 0.0

Теперь у меня есть другое поле PriceSale, поэтому, если Price is NULL я хочу скопировать PriceSale в CustomPrice

"PriceSale":"45.43 AUD",
"PriceSale":"5.40 AUD",
"PriceSale":"40.30 AUD",

так что если "CustomPrice": 0.0, то PriceSale цена должна скопировать в CustomPrice, как показано ниже

"CustomPrice":0.07
 "CustomPrice":10.00
 "CustomPrice": 40.30

Как я могу это сделать?

1 Ответ

0 голосов
/ 25 февраля 2020

Ниже вы можете попытаться заставить вещи работать на вас. Реализация условной реализации copyField, как показано ниже.

package mysolr;

import java.io.IOException;

import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.update.AddUpdateCommand;
import org.apache.solr.update.processor.UpdateRequestProcessor;
import org.apache.solr.update.processor.UpdateRequestProcessorFactory;

public class ConditionalCopyProcessorFactory extends UpdateRequestProcessorFactory
{
  @Override
  public UpdateRequestProcessor getInstance(SolrQueryRequest req, SolrQueryResponse rsp, UpdateRequestProcessor next)
  {
    return new ConditionalCopyProcessor(next);
  }
}

class ConditionalCopyProcessor extends UpdateRequestProcessor
{
  public ConditionalCopyProcessor( UpdateRequestProcessor next) {
    super( next );
  }

  @Override
  public void processAdd(AddUpdateCommand cmd) throws IOException {
    SolrInputDocument doc = cmd.getSolrInputDocument();

    Object v = doc.getFieldValue( "Price" );
    if( v == "AUD" ) {
      Object priceSaleObject = doc.getFieldValue( "PriceSale" );
      float priceSale = Float.parseFloat( priceSaleObject.toString() );
      doc.addField("CustomPrice", priceSale);
      //addField(String name,Object value)
    }

    // pass it up the chain
    super.processAdd(cmd);
  }
}

С этим кодом вам необходимо создать банку с именем "ConditionalCopyProcessorFactory.jar".

. В solrConfig.xml добавьте следующие изменения.

<lib dir="${solr.install.dir:../../../..}/plugins/" regex="ConditionalCopyProcessorFactory.jar" />

<updateRequestProcessorChain name="add-unknown-fields-to-the-schema" default="${update.autoCreateFields:true}"
           processor="uuid,remove-blank,field-name-mutating,parse-boolean,parse-long,parse-double,parse-date,add-schema-fields">
    <processor class="mysolr.ConditionalCopyProcessorFactory"/>
    <processor class="solr.LogUpdateProcessorFactory"/>
    <processor class="solr.DistributedUpdateProcessorFactory"/>
    <processor class="solr.RunUpdateProcessorFactory"/>
</updateRequestProcessorChain>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...