You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by "Robert Muir (JIRA)" <ji...@apache.org> on 2014/07/02 14:01:29 UTC

[jira] [Commented] (LUCENE-5796) Scorer.getChildren() can throw or hide a subscorer for some boolean queries

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

Robert Muir commented on LUCENE-5796:
-------------------------------------

I don't think we should remove the default implementation for FilterScorer, as the scorer is not really changed when using this abstract class, its just wrapped? For the same reason, i think the boostingscorer (since its just an implementation detail of how the current BS2 stuff solves this case) should be transparent.

> Scorer.getChildren() can throw or hide a subscorer for some boolean queries
> ---------------------------------------------------------------------------
>
>                 Key: LUCENE-5796
>                 URL: https://issues.apache.org/jira/browse/LUCENE-5796
>             Project: Lucene - Core
>          Issue Type: Bug
>          Components: core/search
>    Affects Versions: 4.9
>            Reporter: Terry Smith
>            Priority: Minor
>         Attachments: LUCENE-5796.patch
>
>
> I've isolated two example boolean queries that don't behave with release 4.9 of Lucene.
> # A BooleanQuery with three SHOULD clauses and a minimumNumberShouldMatch of 2 will throw an ArrayIndexOutOfBoundsException.
> {noformat}
> java.lang.ArrayIndexOutOfBoundsException: 2
> 	at __randomizedtesting.SeedInfo.seed([2F79B3DF917D071B:2539E6DBC4DF793C]:0)
> 	at org.apache.lucene.search.MinShouldMatchSumScorer.getChildren(MinShouldMatchSumScorer.java:119)
> 	at org.apache.lucene.search.TestBooleanQueryVisitSubscorers$ScorerSummarizingCollector.summarizeScorer(TestBooleanQueryVisitSubscorers.java:261)
> 	at org.apache.lucene.search.TestBooleanQueryVisitSubscorers$ScorerSummarizingCollector.setScorer(TestBooleanQueryVisitSubscorers.java:238)
> 	at org.apache.lucene.search.Weight$DefaultBulkScorer.score(Weight.java:161)
> 	at org.apache.lucene.search.AssertingBulkScorer.score(AssertingBulkScorer.java:64)
> 	at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:621)
> 	at org.apache.lucene.search.AssertingIndexSearcher.search(AssertingIndexSearcher.java:94)
> 	at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:309)
> 	at org.apache.lucene.search.TestBooleanQueryVisitSubscorers.testGetChildrenMinShouldMatchSumScorer(TestBooleanQueryVisitSubscorers.java:196)
> {noformat}
> # A BooleanQuery with two should clauses, one of which is a miss for all documents in the current segment will accidentally mask the scorer that was a hit.
> Unit tests and patch based on {{branch_4x}} are available and will be attached as soon as this ticket has a number.
> They are immediately available on GitHub on branch [shebiki/bqgetchildren|https://github.com/shebiki/lucene-solr/commits/bqgetchildren] as commit [c64bb6f|https://github.com/shebiki/lucene-solr/commit/c64bb6f2df8f33dd8daafc953d9c27b5cbf29fa3].
> I took the liberty of naming the relationship in BoostingScorer.getChildren() {{BOOSTING}}. Suspect someone will offer a better name for this. Here is a summary of the various relationships in play for all Scorer.getChildren() implementations on {{branch_4x}} to help choose.
> || class                                                               || relationships
> | org.apache.lucene.search.AssertingScorer                             | SHOULD
> | org.apache.lucene.search.join.ToParentBlockJoinQuery.BlockJoinScorer | BLOCK_JOIN
> | org.apache.lucene.search.ConjunctionScorer                           | MUST
> | org.apache.lucene.search.ConstantScoreQuery.ConstantScorer           | constant
> | org.apache.lucene.queries.function.BoostedQuery.CustomScorer         | CUSTOM
> | org.apache.lucene.queries.CustomScoreQuery.CustomScorer              | CUSTOM
> | org.apache.lucene.search.DisjunctionScorer                           | SHOULD
> | org.apache.lucene.facet.DrillSidewaysScorer.FakeScorer               | MUST
> | org.apache.lucene.search.FilterScorer                                | calls in.getChildren() 
> | org.apache.lucene.search.ScoreCachingWrappingScorer                  | CACHED
> | org.apache.lucene.search.FilteredQuery.LeapFrogScorer                | FILTERED
> | org.apache.lucene.search.MinShouldMatchSumScorer                     | SHOULD
> | org.apache.lucene.search.FilteredQuery                               | FILTERED
> | org.apache.lucene.search.ReqExclScorer                               | MUST
> | org.apache.lucene.search.ReqOptSumScorer                             | MUST, SHOULD
> | org.apache.lucene.search.join.ToChildBlockJoinQuery                  | BLOCK_JOIN
> I also removed FilterScorer.getChildren() to prevent mistakes and force subclasses to provide a correct implementation.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

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