SOLR: come ignorare il valore 0 (zero) nel processore MinFieldValueUpdateProcessorFactory?

Oct 06 2020

Abbiamo aggiunto campi di prezzo personalizzati in un altro campo "all_prices".

<processor class="solr.CloneFieldUpdateProcessorFactory">
  <str name="source">CustomPrice1</str>
  <str name="source">CustomPrice2</str>
  <str name="source">CustomPrice3</str>
  <str name="dest">all_prices</str>
</processor>

quindi, in solr, sembra

"CustomPrice1":79.95,
"CustomPrice2":69.95,
"CustomPrice3":59.95,
"all_prices":[79.95,69.95,59.95],

Quindi abbiamo aggiunto il processore "MinFieldValueUpdateProcessorFactory" come di seguito:

<processor class="solr.MinFieldValueUpdateProcessorFactory">
  <str name="fieldName">all_prices</str>
</processor>

Ora, i dati in solr saranno come di seguito:

"CustomPrice1":79.95,
"CustomPrice2":69.95,
"CustomPrice3":59.95,
"all_prices":[59.95],

Ora, in alcuni casi quando abbiamo un valore zero nel prezzo personalizzato come di seguito:

"CustomPrice1":24.95,
"CustomPrice2":0.0,
"all_prices":[0.0],

Quindi, in quel caso, vogliamo solo ignorare il valore 0 (zero) e prendere il valore 2nd min in all_price. Come fare questo?

Risposte

1 AbhijitBashetti Oct 06 2020 at 16:53

Puoi definire una classe come di seguito

package mysolr;

import java.util.Collection;
import java.util.Collections;

import org.apache.solr.common.SolrException;
import org.apache.solr.core.SolrCore;
import org.apache.solr.update.processor.FieldMutatingUpdateProcessor.FieldNameSelector;

import static org.apache.solr.common.SolrException.ErrorCode.BAD_REQUEST;
import static org.apache.solr.update.processor.FieldMutatingUpdateProcessor.SELECT_NO_FIELDS;
    public final class SecondMinFieldValueUpdateProcessorFactory extends FieldValueSubsetUpdateProcessorFactory {
    
      @Override
      @SuppressWarnings({"unchecked"})
      public Collection<Object> pickSubset(@SuppressWarnings({"rawtypes"})Collection values) {
        @SuppressWarnings({"rawtypes"})
        Collection result = values;
        try {
          Object[] array = values.toArray();
          Arrays.sort(array);
          Object res = (int)array[0] == 0 ? array[1] : array[0];
          result.clear();
          result.add(res);
  
         } catch (ClassCastException e) {
          throw new SolrException
            (BAD_REQUEST, 
             "Field values are not mutually comparable: " + e.getMessage(), e);
        }
        return result;
      }
    
      @Override
      public FieldNameSelector getDefaultSelector(SolrCore core) {
        return SELECT_NO_FIELDS;
      }
      
    }

Con questo codice è necessario creare un jar denominato "SecondMinFieldValueUpdateProcessorFactory .jar".

In solrConfig.xml, aggiungi le seguenti modifiche.

<lib dir="${solr.install.dir:../../../..}/plugins/" regex="SecondMinFieldValueUpdateProcessorFactory .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.SecondMinFieldValueUpdateProcessorFactory "/>
    <processor class="solr.LogUpdateProcessorFactory"/>
    <processor class="solr.DistributedUpdateProcessorFactory"/>
    <processor class="solr.RunUpdateProcessorFactory"/>
</updateRequestProcessorChain>