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

Boolean query composed of spanqueries can return ArrayIndexOutOfBoundsException if one of the subqueries doesn't have a match

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Duplicate
    • 4.0-BETA
    • 4.0-BETA
    • core/search
    • Windows 7

    • New

    Description

      When building a boolean query of two spanqueryies, if one of the spanqueries does not have a hit, an ArrayIndexOutOfBoundsException is thrown.

      This does not happen when building a boolean query of two TermQuery(ies), nor does it happen if all of the terms have a hit.

      @Test
      public void testBooleanSpanQuery() {
      boolean failed = false;
      int hits = 0;
      try{
      CharArraySet stops = CharArraySet.EMPTY_SET;
      Analyzer indexerAnalyzer = new StandardAnalyzer(LuceneProjectVersion.LUCENE_VERSION, stops);
      Directory directory = new RAMDirectory();

      IndexWriterConfig config = new IndexWriterConfig(LuceneProjectVersion.LUCENE_VERSION, indexerAnalyzer);
      IndexWriter writer = new IndexWriter(directory, config);
      String FIELD = "content";
      Document d = new Document();
      d.add(new TextField(FIELD, "clockwork orange", Field.Store.YES));
      writer.addDocument(d);
      writer.close();

      IndexReader indexReader = DirectoryReader.open(directory);
      IndexSearcher searcher = new IndexSearcher(indexReader);

      BooleanQuery query = new BooleanQuery();
      SpanQuery sq1 = new SpanTermQuery(new Term(FIELD, "clockwork"));
      SpanQuery sq2 = new SpanTermQuery(new Term(FIELD, "clckwork"));
      query.add(sq1, BooleanClause.Occur.SHOULD);
      query.add(sq2, BooleanClause.Occur.SHOULD);
      TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
      searcher.search(query, collector);
      hits = collector.topDocs().scoreDocs.length;
      for (ScoreDoc scoreDoc : collector.topDocs().scoreDocs)

      { System.out.println(scoreDoc.doc); }

      } catch (java.lang.ArrayIndexOutOfBoundsException e)

      { failed = true; }

      catch (IOException e)

      { e.printStackTrace(); }

      assertEquals("Bug in boolean query composed of span queries", failed, false);
      assertEquals("Bug in boolean query composed of span queries", hits, 1);
      }

      Attachments

        1. LUCENE-4477.patch
          4 kB
          Michael McCandless

        Activity

          People

            Unassigned Unassigned
            tallison Tim Allison
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: