Uploaded image for project: 'Lucene - Core'
  1. Lucene - Core
  2. LUCENE-9005

BooleanQuery.visit() incorrectly pulls subvisitors from its parent

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: master (9.0), 8.3
    • Component/s: None
    • Labels:
      None
    • Lucene Fields:
      New

      Description

      BooleanQuery.visit() calls getSubVisitor once for each of its clause sets; however, this sub visitor is called on the passed-in visitor, which means that sub clauses get attached to its parent, rather than a visitor for that particular BQ.

      To illustrate, consider the following nested BooleanQuery: ("a b" (+c +d %e f)); we have a top-level disjunction query containing one phrase query (essentially a conjunction), and one boolean query containing both MUST, FILTER and SHOULD clauses. When visiting, the top level query will pull a SHOULD subvisitor, and pass both queries into it. The phrase query will pull a MUST subvisitor and all its two terms. The nested boolean will pull a MUST, and FILTER and a SHOULD; but these are all attached to the parent SHOULD visitor - in particular, the MUST and FILTER clauses will end up being attached to this SHOULD visitor, and be mis-interpreted as a disjunction.

      To fix this, BQ should first pull a MUST visitor and visit its MUST clauses using this visitor; SHOULD, FILTER and MUST_NOT clauses should then be pulled from this top-level MUST visitor.

        Attachments

        1. LUCENE-9005.patch
          2 kB
          Alan Woodward

          Activity

            People

            • Assignee:
              romseygeek Alan Woodward
              Reporter:
              romseygeek Alan Woodward
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: