Yes. The decoding of a payload based on its schema type is what the payload() function does. Your Payloader won't currently work well/legibly for fields encoded numerically:
https://github.com/o19s/payload-component/blob/master/src/main/java/com/o19s/payloads/Payloader.java#L130 <https://github.com/o19s/payload-component/blob/master/src/main/java/com/o19s/payloads/Payloader.java#L130> I think that code could probably be slightly enhanced to leverage PayloadUtils.getPayloadDecoder(fieldType) and use bytes if the field type doesn't have a better decoder. Erik > On Oct 21, 2019, at 2:55 PM, Eric Pugh <ep...@opensourceconnections.com> > wrote: > > Have you checked out > https://github.com/o19s/payload-component > > On Mon, Oct 21, 2019 at 2:47 PM Erik Hatcher <erik.hatc...@gmail.com> wrote: > >> How about a single field, with terms like: >> >> store1_USD|125.0 store2_EUR|220.0 store3_GBP|225.0 >> >> Would that do the trick? >> >> And yeah, payload decoding is currently limited to float and int with the >> built-in payload() function. We'd need a new way to pull out >> textual/bytes payloads - like maybe a DocTransformer? >> >> Erik >> >> >>> On Oct 21, 2019, at 9:59 AM, Vincenzo D'Amore <v.dam...@gmail.com> >> wrote: >>> >>> Hi Erick, >>> >>> thanks for getting back to me. We started to use payloads because we have >>> the classical per-store pricing problem. >>> Thousands of stores across and different prices. >>> Then we found the payloads very useful started to use it for many >> reasons, >>> like enabling/disabling the product for such store, save the stock >>> availability, or save the other info like buy/sell price, discount rates, >>> and so on. >>> All those information are numbers, but stores can also be in different >>> countries, I mean would be useful also have the currency and other >>> attributes related to the store. >>> >>> Thinking about an alternative for payloads maybe I could use the dynamic >>> fields, well, I know it is ugly. >>> >>> Consider this hypothetical case where I have two field payload : >>> >>> payloadPrice: [ >>> "store1|125.0", >>> "store2|220.0", >>> "store3|225.0" >>> ] >>> >>> payloadCurrency: [ >>> "store1|USD", >>> "store2|EUR", >>> "store3|GBP" >>> ] >>> >>> with dynamic fields I could have different fields for each document. >>> >>> currency_store1_s: "USD" >>> currency_store2_s: "EUR" >>> currency_store3_s: "GBP" >>> >>> But how many dynamic fields like this can I have? more than thousands? >>> >>> Again, I've just started to look at solr-ocrhighlighting github project >> you >>> suggested. >>> Those seems have written their own payload object type where store ocr >>> highlighting information. >>> It seems interesting, I'll take a look immediately. >>> >>> Thanks again for your time. >>> >>> Best regards, >>> Vincenzo >>> >>> >>> On Mon, Oct 21, 2019 at 2:55 PM Erick Erickson <erickerick...@gmail.com> >>> wrote: >>> >>>> This is one of those situations where I know a client did it, but didn’t >>>> see the code myself. >>>> >>>> So I can’t help much. >>>> >>>> Perhaps a good question at this point, though, is “why do you want to >> add >>>> string payloads anyway”? >>>> >>>> This isn’t the client, but it might give you some pointers: >>>> >>>> >>>> >> https://github.com/dbmdz/solr-ocrpayload-plugin/blob/master/src/main/java/de/digitalcollections/solr/plugin/components/ocrhighlighting/OcrHighlighting.java >>>> >>>> Best, >>>> Erick >>>> >>>>> On Oct 21, 2019, at 6:37 AM, Vincenzo D'Amore <v.dam...@gmail.com> >>>> wrote: >>>>> >>>>> Hi Erick, >>>>> >>>>> It seems I've reached a dead-point, or at least it seems looking at the >>>>> code, it seems I can't easily add a custom decoder: >>>>> >>>>> Looking at PayloadUtils class there is getPayloadDecoder method invoked >>>> to >>>>> return the PayloadDecoder : >>>>> >>>>> public static PayloadDecoder getPayloadDecoder(FieldType fieldType) { >>>>> PayloadDecoder decoder = null; >>>>> >>>>> String encoder = getPayloadEncoder(fieldType); >>>>> >>>>> if ("integer".equals(encoder)) { >>>>> decoder = (BytesRef payload) -> payload == null ? 1 : >>>>> PayloadHelper.decodeInt(payload.bytes, payload.offset); >>>>> } >>>>> if ("float".equals(encoder)) { >>>>> decoder = (BytesRef payload) -> payload == null ? 1 : >>>>> PayloadHelper.decodeFloat(payload.bytes, payload.offset); >>>>> } >>>>> // encoder could be "identity" at this point, in the case of >>>>> DelimitedTokenFilterFactory encoder="identity" >>>>> >>>>> // TODO: support pluggable payload decoders? >>>>> >>>>> return decoder; >>>>> } >>>>> >>>>> Any advice to work around this situation? >>>>> >>>>> >>>>> On Mon, Oct 21, 2019 at 1:51 AM Erick Erickson < >> erickerick...@gmail.com> >>>>> wrote: >>>>> >>>>>> You’d need to write one. Payloads are generally intended to hold >>>> numerics >>>>>> you can then use in a function query to factor into the score… >>>>>> >>>>>> Best, >>>>>> Erick >>>>>> >>>>>>> On Oct 20, 2019, at 4:57 PM, Vincenzo D'Amore <v.dam...@gmail.com> >>>>>> wrote: >>>>>>> >>>>>>> Sorry, I just realized that I was wrong in how I'm using the payload >>>>>>> function. >>>>>>> Give that the payload function only handles a numeric (integer or >>>> float) >>>>>>> payload, could you suggest me an alternative function that handles >>>>>> strings? >>>>>>> If not, should I write one? >>>>>>> >>>>>>> On Sun, Oct 20, 2019 at 10:43 PM Vincenzo D'Amore < >> v.dam...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Hi all, >>>>>>>> >>>>>>>> I'm trying to understand what I did wrong with a payload query that >>>>>>>> returns >>>>>>>> >>>>>>>> error: { >>>>>>>> metadata: [ "error-class", "org.apache.solr.common.SolrException", >>>>>>>> "root-error-class", "org.apache.solr.common.SolrException" ], >>>>>>>> msg: "No payload decoder found for field: colorCode", >>>>>>>> code: 400 >>>>>>>> } >>>>>>>> >>>>>>>> I have reduced my problem in a little sample to show what happens to >>>> me. >>>>>>>> Basically I have a document with a couple of payload fields one >>>>>>>> delimited_payloads_string and one delimited_payloads_integer >>>>>>>> >>>>>>>> { >>>>>>>> field_dps: "key|data", >>>>>>>> field_dpi: "key|1", >>>>>>>> } >>>>>>>> >>>>>>>> When I execute this query solr returns as expected the payload for >> the >>>>>> key >>>>>>>> >>>>>>>> q=*:*&fl=payload(field_dpi,key) >>>>>>>> >>>>>>>> { >>>>>>>> payload(field_dpi,key): 1 >>>>>>>> } >>>>>>>> >>>>>>>> But for the strings there have to be something of different to do, >>>>>> because >>>>>>>> I'm unable receive the payload value back. Executing this query, as >> in >>>>>> the >>>>>>>> short introduction of this post, I receive an error. >>>>>>>> >>>>>>>> ?q=*:*&fl=payload(field_dps,key) >>>>>>>> >>>>>>>> error: { >>>>>>>> metadata: [ "error-class", "org.apache.solr.common.SolrException", >>>>>>>> "root-error-class", "org.apache.solr.common.SolrException" ], >>>>>>>> msg: "No payload decoder found for field: colorCode", >>>>>>>> code: 400 >>>>>>>> } >>>>>>>> >>>>>>>> Am I doing something wrong? How can I read strings payload data? >>>>>>>> >>>>>>>> Thanks in advance for your time, >>>>>>>> Vincenzo >>>>>>>> >>>>>>>> -- >>>>>>>> Vincenzo D'Amore >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Vincenzo D'Amore >>>>>> >>>>>> >>>>> >>>>> -- >>>>> Vincenzo D'Amore >>>> >>>> >>> >>> -- >>> Vincenzo D'Amore >> >>