No problem Elran. As Shalin mentioned, you will need to do it like this: <processor class="solr.DistributedUpdateProcessorFactory"/> <processor class="mycode.solr_plugins.FieldManipulationProcessorFactory" /> <processor class="solr.LogUpdateProcessorFactory" /> <processor class="solr.RunUpdateProcessorFactory" />
On 28 October 2014 03:22, Shalin Shekhar Mangar <shalinman...@gmail.com> wrote: > Hi Elran, > > You need to explicitly specify the DistributedUpdateProcessorFactory in the > chain and then add your custom processor after it. > > On Mon, Oct 27, 2014 at 9:26 PM, Elran Dvir <elr...@checkpoint.com> wrote: > > > Thank you very much for your suggestion. > > > > I created an update processor factory with my logic. > > I changed the update processor chain to be: > > <processor class="solr.LogUpdateProcessorFactory" /> > > <processor class="solr.RunUpdateProcessorFactory" /> > > <processor class="mycode.solr_plugins.FieldManipulationProcessorFactory" > /> > > > > But nothing seems to happen. > > When I move my class to be the first in the chain, the logic is running > > (not as I want, of course. It's calculated based on the update value > rather > > than the stored value) . > > How can I define a custom update processor factory that will run after > > DistributedUpdateProcessorFactory? > > > > Thank you very much. > > > > > > -----Original Message----- > > From: Matthew Nigl [mailto:matthew.n...@gmail.com] > > Sent: Monday, October 27, 2014 12:10 PM > > To: solr-user@lucene.apache.org > > Subject: Re: suggestion for new custom atomic update > > > > You can get the summed value, 13, if you add a processor after > > DistributedUpdateProcessorFactory in the URP chain. Then one possibility > > would be to clone this value to another field, such as field_b, and run > > other processors on that field. > > > > Or for something more customized, you can use the > > StatelessScriptUpdateProcessorFactory, and retrieve the value of field_a > > with: > > > > var doc = cmd.solrDoc; // org.apache.solr.common.SolrInputDocument > > var field_a = doc.getFieldValue("field_a"); > > > > Note if you try to get the value of field_a before > > DistributedUpdateProcessorFactory, then using your example with an atomic > > update, the value would be 5 (the value of the increment from the input > > document). > > > > > > On 27 October 2014 18:03, Elran Dvir <elr...@checkpoint.com> wrote: > > > > > I will explain with an example. > > > Let's say field_a is sent in the update with the value of 5. field_a > > > is already stored in the document with the value 8. > > > After the update field_a should have the value 13 (sum). > > > The value of field_b will be based on the value of 13 and not 5. > > > Is there a way in URP to know what is the value which is already > > > stored in field_a? > > > > > > Thank you very much. > > > > > > -----Original Message----- > > > From: Alexandre Rafalovitch [mailto:arafa...@gmail.com] > > > Sent: Sunday, October 26, 2014 6:07 PM > > > To: solr-user > > > Subject: Re: suggestion for new custom atomic update > > > > > > I am not sure what the problem is. URP catches all operations. So, you > > > can modify the source document to add the calculation when the field_a > > > is either new or updated. > > > > > > Or are you trying to calculate things across multiple documents? In > > > that case, neither mine nor your solution will work, I think. > > > > > > Regards, > > > Alex. > > > Personal: http://www.outerthoughts.com/ and @arafalov Solr resources > > > and > > > newsletter: http://www.solr-start.com/ and @solrstart Solr > > > popularizers > > > community: https://www.linkedin.com/groups?gid=6713853 > > > > > > > > > On 26 October 2014 12:00, Elran Dvir <elr...@checkpoint.com> wrote: > > > > Thanks for your response. > > > > > > > > If the calculation is based on the most recent summed value of > > > > field_a > > > and the value of field_a in the update, how can I? > > > > > > > > Thanks. > > > > > > > > -----Original Message----- > > > > From: Alexandre Rafalovitch [mailto:arafa...@gmail.com] > > > > Sent: Sunday, October 26, 2014 2:11 PM > > > > To: solr-user > > > > Subject: RE: suggestion for new custom atomic update > > > > > > > > Can't you do the calculation in custom UpdateRequestProcessor? > > > > > > > > Regards, > > > > Alex > > > > On 26/10/2014 4:17 am, "Elran Dvir" <elr...@checkpoint.com> wrote: > > > > > > > >> Hi all, > > > >> > > > >> Did anyone have a chance to review my idea? > > > >> > > > >> Thanks. > > > >> > > > >> -----Original Message----- > > > >> From: Elran Dvir > > > >> Sent: Monday, October 20, 2014 12:42 PM > > > >> To: solr-user > > > >> Subject: 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. > > > >> > > > > > > > > > > > > Email secured by Check Point > > > > > > Email secured by Check Point > > > > > > > > > -- > Regards, > Shalin Shekhar Mangar. >