You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by "Adrien Grand (JIRA)" <ji...@apache.org> on 2015/09/08 18:12:47 UTC

[jira] [Commented] (LUCENE-6785) Consider merging Query.rewrite() into Query.createWeight()

    [ https://issues.apache.org/jira/browse/LUCENE-6785?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14735064#comment-14735064 ] 

Adrien Grand commented on LUCENE-6785:
--------------------------------------

+1 to fold rewrite into createWeight

For the record I tried to merge them in the past but got some issues. For instance if you have a constant-score query that wraps a fuzzy query today, Weight.getQuery on the CSQ would return a CSQ that wraps a BooleanQuery, since rewriting happened before we created the Weight. This is desirable because query caching is based on the result of Weight.getQuery and using the rewritten query is better since there are odds that several queries will rewrite to the same primitive query. If we simply put the rewriting logic at the top of createWeight, then this won't be the case anymore. So I guess BooleanQuery would have to be changed eg. to create the sub-weights first, then rewrite itself entirely using the queries returned by Weight.getQuery() on the sub weights and finally create the BooleanWeight?

> Consider merging Query.rewrite() into Query.createWeight()
> ----------------------------------------------------------
>
>                 Key: LUCENE-6785
>                 URL: https://issues.apache.org/jira/browse/LUCENE-6785
>             Project: Lucene - Core
>          Issue Type: Improvement
>            Reporter: Alan Woodward
>
> Prompted by the discussion on LUCENE-6590.
> Query.rewrite() is a bit of an oddity.  You call it to create a query for a specific IndexSearcher, and to ensure that you get a query implementation that has a working createWeight() method.  However, Weight itself already encapsulates the notion of a per-searcher query.
> You also need to repeatedly call rewrite() until the query has stopped rewriting itself, which is a bit trappy - there are a few places (in highlighting code for example) that just call rewrite() once, rather than looping round as IndexSearcher.rewrite() does.  Most queries don't need to be called multiple times, however, so this seems a bit redundant.  And the ones that do currently return un-rewritten queries can be changed simply enough to rewrite them.
> Finally, in pretty much every case I can find in the codebase, rewrite() is called purely as a prelude to createWeight().  This means, in the case of for example large BooleanQueries, we end up cloning the whole query structure, only to throw it away immediately.
> I'd like to try removing rewrite() entirely, and merging the logic into createWeight(), simplifying the API and removing the trap where code only calls rewrite once.  What do people think?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org