Although the 'scale' is a big part of it, here's a closer breakdown. Here are 4 queries with increasing functions, and theei response times (caching turned off in solrconfig):
100 msec: select?q={!edismax v='news' qf='title^2 body'} 135 msec: select?qq={!edismax v='news' qf='title^2 body'}q={!func}product(field(myfield),query($qq)&fq={!query v=$qq} 200 msec: select?qq={!edismax v='news' qf='title^2 body'}q={!func}sum(product(0.75,query($qq)),product(0.25,field(myfield))))&fq={!query v=$qq} 320 msec: select?qq={!edismax v='news' qf='title^2 body'}&scaledQ=scale(product(query($qq),1),0,1)&q={!func}sum(product(0.75,$scaledQ),product(0.25,field(myfield)))&fq={!query v=$qq} Btw, that no-op product is necessary, else you get this exception: org.apache.lucene.search.BooleanQuery$BooleanWeight cannot be cast to org.apache.lucene.queries.function.valuesource.ScaleFloatFunction$ScaleInfo thanks, peter On Wed, Nov 27, 2013 at 1:30 PM, Chris Hostetter <hossman_luc...@fucit.org>wrote: > > : So, this query does just what I want, but it's typically 3 times slower > : than the edismax query without the functions: > > that's because the scale() function is inhernetly slow (it has to > compute the min & max value for every document in order to know how to > scale them) > > what you are seeing is the price you have to pay to get that query with a > "normalized" 0-1 value. > > (you might be able to save a little bit of time by eliminating that > no-Op multiply by 1: "product(query($qq),1)" ... but i doubt you'll even > notice much of a chnage given that scale function. > > : Is there any way to speed this up? Would writing a custom function query > : that compiled all the function queries together be any faster? > > If you can find a faster implementation for scale() then by all means let > us konw, and we can fold it back into Solr. > > > -Hoss >