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 <[email protected]>
> wrote:
>
> Have you checked out
> https://github.com/o19s/payload-component
>
> On Mon, Oct 21, 2019 at 2:47 PM Erik Hatcher <[email protected]> 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 <[email protected]>
>> 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 <[email protected]>
>>> 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 <[email protected]>
>>>> 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 <
>> [email protected]>
>>>>> 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 <[email protected]>
>>>>>> 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 <
>> [email protected]>
>>>>>>> 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
>>
>>