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>