Don’t go to thousands of fields, it’s usually a bad idea for that many fields.

If all you’re doing is returning the data for display, have you considered 
indexing, perhaps in a separate field, a string token for each? Something like
store1_USD_125.00
?

Then have the UI split that apart in a pleasing manner.

Doesn’t work if you want to, say, sort by price though.

Erick

> On Oct 21, 2019, at 10:19 AM, Alexandre Rafalovitch <arafa...@gmail.com> 
> wrote:
> 
> I remember several years ago a discussion/blog post about a similar
> problem. The author went through a lot of thinking and decided that
> the best way to deal with a similar problem was to have Solr documents
> represent different level of abstraction, more granular.
> 
> IIRC, the equivalent for your example would be to represent 'pricing'
> (or even pricing/availability) as the document, not a 'product'. You
> may need to duplicate product field values for that to work. But that
> - apparently - allowed them to represent a lot of concepts (like
> upcoming discounts, etc) easier by just adding availability dates, etc
> into that final lower-level record. And, of course, allowed to update
> individual store/product price by changing one record per time without
> having to invalidate the cache for all other stores.
> 
> Regards,
>   Alex.
> 
> 
> On Mon, 21 Oct 2019 at 09:59, 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