On Nov 7, 2011, at 3:41 PM, Chris Hostetter wrote:

> 
> : I would love to know when it is okay to return a ConstantScoreQuery 
> : wrapping my Filter so that I needn't bother with my ValueSource.  In my 
> : opinion, FieldType should have a getFieldFilter() method similar to 
> : getFieldQuery().  Perhaps a hint of some kind could be added to the 
> : QParser handed in -- a boolean flag or some special local-param to 
> : indicate the constant score to use.  Solr could perform this when the 
> : QParser is constructed for a Filter Query.
> 
> my gut raction is that this seems like it could be dangerous in the 
> general case -- it could lead to subtle bugs where a FieldType might 
> inadvertantly produce a query that matches different documents depending 
> on context (doesn't mean we shouldn't do it, just a risk i worry about)
> 
> if we do go this route, adding it as a hint on the QParser seems like a 
> cleaner appraoch then a completely new method on FieldType (particularly 
> because then generic QParsers might be able to leverage this info as well 
> ... consider fq={!geofilt ... } vs q={!geofilt ... }).

The QParser hint is definitely a practical solution that I can use right now as 
you suggest below. I'd like to see QueryComponent introduce this hint when it 
creates the Query from the fq param.  I'll create a JIRA issue.

My proposal of a FieldType.getFilter() method is not a mutually exclusive 
suggestion with the QParser hint.  FieldType already has a getFieldQuery(), 
getRangeQuery() and getValueSource() methods... a getFilter() method seems 
oddly missing to me.  With this in place, and a QParser hint in place as well, 
the getFieldQuery() method in FieldType could check for the hint and return a 
new ConstantScoreQuery(getFilter(...)).  If the hint is false then another 
method could be delegated to for FieldType subclasses that need custom 
behavior.  Perhaps this addition would facilitate Solr's support for 
LUCENE-1536 "if a filter can support random access API, we should use it"  I am 
not sure honestly.


> As a first pass i would suggest that your FieldType could do this kind of 
> logic as is right now by reqiring a special param (local or otherwise), 
> something like...
> 
>       fq={!field needScore=false f=yourSpecialField}foo
> 
> ...where your field type has...
> 
>  public Query getFieldQuery(QParser parser, SchemaField field, String 
> externalVal) 
>    Filter f = makeFilter(...);
>    if (parser.getLocalParams().getBool("needScore", true)) {
>      ValueSource vs = makeValueSource(...);
> uses memory
>      return new FilteredQuery( new FunctionQuery(vs), f );
>    } 
>    return new ConstantScoreQuery(f);
>  }
> 
> ...in general this type of explicit approach (based on a param) is 
> apealing because it would help mitigate the risk i mentioned about queries 
> matching diff docs being (accidently?) produced depending on context -- 
> much easier to spot/understand if the query changes if-and-only-if a param 
> changes.
> 
> 
> 
> -Hoss
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to