Lucene - Core
  1. Lucene - Core
  2. LUCENE-5307

Inconsistency between Weight.scorer documentation and ConstantScoreQuery on top of a Filter

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 4.6, Trunk
    • Component/s: core/search
    • Labels:
      None
    • Lucene Fields:
      New

      Description

      Weight.scorer states that if topScorer == true, Scorer.collect will be called and that otherwise Scorer.nextDoc/advance will be called.

      This is a problem when ConstantScoreQuery is used on top of a QueryWrapperFilter:
      1. ConstantScoreWeight calls getDocIdSet on the filter to know which documents to collect.
      2. QueryWrapperFilter.getDocIdSet returns a Scorer created with topScorer == false so that nextDoc/advance are supported.
      3. But then ConstantScorer.score(Collector) has the following optimization:

          // this optimization allows out of order scoring as top scorer!
          @Override
          public void score(Collector collector) throws IOException {
            if (docIdSetIterator instanceof Scorer) {
              ((Scorer) docIdSetIterator).score(wrapCollector(collector));
            } else {
              super.score(collector);
            }
          }
      

      So the filter iterator is a scorer which was created with topScorer = false but ParentScorer ends up using its score(Collector) method, which is illegal. (I found this out because AssertingSearcher has some checks to make sure Scorers are used accordingly to the value of topScorer.)

      I can imagine several fixes, including:

      • removing this optimization when working on top of a filter
      • relaxing Weight documentation to allow for using score(Collector) when topScorer == false

      but I'm not sure which one is the best one. What do you think?

      1. LUCENE-5307.patch
        7 kB
        Uwe Schindler
      2. LUCENE-5307.patch
        8 kB
        Uwe Schindler
      3. LUCENE-5307-test.patch
        4 kB
        Adrien Grand

        Activity

        Uwe Schindler made changes -
        Status Open [ 1 ] Resolved [ 5 ]
        Resolution Fixed [ 1 ]
        Uwe Schindler made changes -
        Attachment LUCENE-5307.patch [ 12610391 ]
        Uwe Schindler made changes -
        Fix Version/s 4.6 [ 12324999 ]
        Fix Version/s 5.0 [ 12321663 ]
        Component/s core/search [ 12310235 ]
        Uwe Schindler made changes -
        Attachment LUCENE-5307.patch [ 12610370 ]
        Adrien Grand made changes -
        Attachment LUCENE-5307-test.patch [ 12610358 ]
        Uwe Schindler made changes -
        Field Original Value New Value
        Assignee Adrien Grand [ jpountz ] Uwe Schindler [ thetaphi ]
        Adrien Grand created issue -

          People

          • Assignee:
            Uwe Schindler
            Reporter:
            Adrien Grand
          • Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development