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.

Reply via email to