: We are experiencing high query times in Solr when using an fq filter that
: combines an OR condition with frange. The response time significantly
: increases compared to queries that do not use this combination.
: 
: Query Example
: fq={!cache=false tag=prm}field:value OR {!frange l=1 u=1 v=$funcQuery}

The first thing i want to make sure you understand is that the {!...} 
syntax is prefix based, so {!cache=false tag=prm} applies to the *entire* 
"fq" param -- not just the "field:value" boolean clause -- i want to 
clarify that because the way you describe breakign the query down implies 
you think otherwise...

: Observations
: 1) When we use just {!frange l=1 u=1 v=$funcQuery}, the query executes
: quickly[20ms].

Details matter -- you say "when we use just ..." the frange portion it's 
quick -- but you're not clarifying *how* you use the frange portion by 
itself.

If you mean a request with 'fq={!frange l=1 u=1 v=$funcQuery}' is quick, 
that's likely because it winds up being slow the first time, and 
then cached in the filterCache for very fast subsequent use.

: Question
: 1) Why does the OR operation with frange cause a significant increase in
: query time?

The way an frange query works is that it scans every document in the index 
to compute the function value, and then checks if it is in range.

In general, when Lucnee/Solr execute a two clause boolean "AND" query, 
the searcher can tell individual clauses to "skip ahead" based on the 
current match point from the other AND clause

So in the case of "X:Y AND {!frange...}" where X:Y only matches a small 
subset of the index, the frange doesn't have to be computed for every 
document in the index, it gets to skip ahead to the first match of "X:Y" 
and then skip ahead to the second match of "X:Y", etc...

With "X:Y OR {!frange...}" it still has compute the function for every 
document in the index ... and when you combine that with the "cache=false" 
(on the entire "fq") 

: 2) Are there any optimizations or alternative query structures that could
: improve performance?

you can use the special (and slightly odd) "filter()" syntax in the 
default parser to say that a particular boolean clause should be cached as 
non-scoring clause (and that cache hit will be re-used even when using in 
other boolean queries...

fq=X:Y OR filter({!frange...})
fq=X:Z OR filter({!frange...}) // the frange will be a filterCache hit


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

Reply via email to