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
>> 
>> 

Reply via email to