Chris Hostetter wrote:
independent of the QueryParser aspects of your question, adding a setSimilarity method to the Query class would be a complete 180 of how it currently works right now.

Query classes have to have a getSimilarity method so that their Weight/Scorer have a way to access the similarity functions ... but every core type of query gets that similarity from the searcher being used when hte query is executed.

if the Query class defined a "setSimilarity" then the similarity used by one query in a BooleanQuery might not be the same as another query in the same query structure ... queryNorms, idfs, tfs ... could all be completley nonsensical.

The getSimilarity() implementation in Query actually invokes Searcher.getSimilarity() which in turn returns the value of Similarity.getDefault()

IndexSearcher has a corresponding setSimilarity() method which will override the value return value which makes it convenient for what you're trying to accomplish.

There is, however, another point of discord -- which is the Weight associated with the Query (which is relevant if you want a different implementation of term weighting). Here the locus of control is inverted -- it is the Searcher which delegates to the Query in order to create the Weight. In order to change the scoring implementation one needs to implement a new Query class, a new Weight class, a new Similarity class and a new QueryParser.

A friendlier alternative I'd like to propose is a sort of Weight and Similarity factory which is provided either to the top level Query object that is returned from parsing -- or to the Searcher object that processes the query. The factory can then return Similarity and Weight implementations that are identical for all parts of the query and which are mutually consistent.

This would allow field specific Similarity and Weight implementations and would also be backwards compatible.

A more logical extension point is probably long the lines of past discussion towards making all of the Similarity methods take in a field name (so you could have a "PerFieldSimilarityWrapper" type implementation) and/or changing Searchable.getSimilarity to take in a fieldname param.

i don't think anyone every submitted a patch for either of those ideas though ... if you check the mailing list archives you'll see there were performance concerns about one of them (i think it was the first one because some of those methods are in tight loops, which is unfortunate because it's the one that can be done in a backwards compatible way)




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to