You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-user@lucene.apache.org by Elran Dvir <el...@checkpoint.com> on 2014/10/20 11:41:48 UTC
suggestion for new custom atomic update
Hi all,
This is my use case:
I have a stored field, field_a, which is atomic updated (let's say by "inc"). field_a is stored but not indexed due to the large number of distinct values it can have.
I need to index field_b (I need facet and stats on it) which is not in the document but its value is based on a calculation of the recent (e.g. summed) value of field_a.
There is no way to do it nowadays.
So I thought of a new method: custom atomic update.
There will be a new interface in Solr:
public interface CustomAtomicUpdater {
public void update(SolrInputDocument oldDoc, String fieldName, Object fieldVal) ;
}
There will be a new attribute for fields in schema.xml called "customAtomicUpdateClass" (and all support in code, of course).
The value is a class which is an implementation of CustomAtomicUpdater.
In our example it will be defined for field_a.
In method "getUpdatedDocument" in DistributedUpdateProcessor.java, we will add handling of "custom" case:
} else if ("custom".equals(key)) {
updateField = true;
SchemaField sf = schema.getField(sif.getName());
String customAtomicUpdaterClassName = sf.getCustomAtomicUpdaterClass();
if (customAtomicUpdaterClassName == null) {
throw new SolrException(ErrorCode.BAD_REQUEST, "There is no customAtomicUpdaterClass defined for " + sif + ".");
}
CustomAtomicUpdater updater = schema.getResourceLoader()
.newInstance(customAtomicUpdaterClassName, CustomAtomicUpdater.class);
if (updater == null) {
throw new SolrException(ErrorCode.BAD_REQUEST, "Was unable to create instance of " + customAtomicUpdaterClassName + ".");
}
updater.update(oldDoc, sif.getName(), fieldVal);
}
In my implementation I will sum field_a (oldvalue + newvalue) and update field_b according to my logic.
Example of use:
<add>
<doc>
<field name="field_a" update="custom">128</field>
</doc>
</add>
What do say about my suggestion?
Thanks.