Sorry, I missed out "boost_mode": "replace" in my function_score example above. I want the score to be the exact converted currency, so I can make use of it in code.
On Thursday, April 16, 2015 at 10:44:35 AM UTC+1, David Dyball wrote: > > Hi All, > > TL;DR: Doing dynamic currency conversion via function_score works great > for scenarios where I want to sort by prices, > but I want the same functionality in queries that will be sorted by > relevance score when using terms while still retaining > a dynamically calulated field for converted price. > > Long version: > > I'm looking to deploy Elasticsearch as a primary search engine for a > catalog of products. Each product has a > provider_price and provider_currency field. The "provider_price" is > always in the currency specified by > "provider_currency". When a user gets their search results they want to > display it in their local currency. To > do this I've come up with two different queries depending on how the > results will be sorted for the end user. > > 1) If the user requests a price-based sorting (asc/desc) then I'm using a > function_score query like so: > > { > "query": { > "function_score": { > "functions": [ > "script_score": { > "script": "( rates[_source.provider_currency] * > _source.provider_price )", > "params": { > "rates": { > "USD": 1, > "AUD": 0.75, > ... > ... > ... > } > } > } > ], > "query": { > "filtered": { > ........ > } > } > }, > "sort": { > { > "_score": "asc/desc" > } > } > } > > 2) When sorting by terms or other fields in the document I still need to > calculate the converted price, so I'm using script_fields like so: > > { > "fields": [ > "_source" > ], > "query": { > ...... > }, > "script_fields": { > "user_price": { > "script": "( rates[_source.provider_currency] * > _source.provider_price )", > "params": { > "rates": { > "USD": 1, > "AUD": 0.75, > ... > ... > ... > } > } > } > }, > "sort": [ > { > "_score": "desc" > } > ] > } > > > A few queries with the above: > > 1) Does this generally seem like a sane implementation? > > 2) These both work perfectly for doing on-the-fly conversions of > currency and returing it with the documents, > but at the moment my app-side code has to make the distinction > between price-sorting queries and term > queries and issue the correct one, as well extract the converted > price from the correct field depending > (_score or _source.user_price respectively). > > Is there any way to simplify this? > > e.g. When doing a function_score query, copy the _score to another > generated field called "user_score". > That way the code only needs to know about one field ("user_score") > for both queries. > > Cheers for any assistance the community can provide. > > David. > -- You received this message because you are subscribed to the Google Groups "elasticsearch" group. To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/4fcdbf81-a081-4eb9-a292-35a506ee9c65%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.