: I have a "country" field in my index, with values like 'US', 'FR', 'UK',
: etc...
: 
: Then I want our users to be able to define the order of their preferred
: countries so that grouped results are sorted according to their preference.
        ...
: Is there any other function that would allow me to map from a predefined
: String constant into an Integer that I can sort on ?

Because of how they evolved, and most of the common usecases for them, 
there aren't a lot of functions that operate on "strings".

Assuming your "country" field is a single valued (indexed) string field, 
then what you want can be done fairly simply using the the "termfreq()" 
function.

termfreq(country,US) will return the (raw integer) term frequency for 
"Term(country,US)" for each doc -- assuming it's single valued (and not 
tokenized) that means for every doc it will be either a 0 or a 1.

so you can either modify your earlier attempt at using "map" on the string 
values to do a map over the termfreq output, or you can simplify things to 
just multiply take the max value -- where max is just a short hand for 
"the non 0 value" ...

    max(mul(9,termfreq(country,US)),
        mul(8,termfreq(country,FR)),
        mul(7,termfreq(country,UK)),
        ...)

Things get more interesting/complicated if the field isn't single valued, 
or is tokenized -- then individual values (like "US") might have a 
termfreq that is greater then 1, or a doc might have more then one value, 
and you have to decide what kind of math operation you want to apply over 
those...

  * ignore termfreqs and ony look at if term exists? 
    - wrap each termfreq in map to force value to either 0 or 1
  * want to sort by sum of (weights * termfreq) for each term?
    - change max to sum in above example
  * ignore all but the "main" term that has hte highest freq for each doc?
    - not easy at query time - best to figure out the "main" term at index 
      time and put in it's own field.


-Hoss
http://www.lucidworks.com/

Reply via email to