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

NPE in o.a.l.codecs.perfield.PerFieldPostingsFormat

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Open
    • Priority: Minor
    • Resolution: Unresolved
    • Affects Version/s: 7.5, master (9.0)
    • Fix Version/s: None
    • Component/s: core/codecs
    • Environment:
    • Lucene Fields:
      New

      Description

      Requesting this URL in SOLR gives a 500 error with a stack trace pointing to Lucene:

      http://localhost:8983/solr/films/select?q=\{!complexphrase}genre:"-om*"

      The stack trace is (cut down to the reasonably relevant part):

      {{java.lang.NullPointerException\n\tat java.util.TreeMap.getEntry(TreeMap.java:347)
      at java.util.TreeMap.get(TreeMap.java:278)
      at org.apache.lucene.codecs.perfield.PerFieldPostingsFormat$FieldsReader.terms(PerFieldPostingsFormat.java:311)
      at org.apache.lucene.index.CodecReader.terms(CodecReader.java:106)
      at org.apache.lucene.index.FilterLeafReader.terms(FilterLeafReader.java:351)
      at org.apache.lucene.index.ExitableDirectoryReader$ExitableFilterAtomicReader.terms(ExitableDirectoryReader.java:91)
      at org.apache.lucene.search.spans.SpanNearQuery$SpanNearWeight.getSpans(SpanNearQuery.java:208)
      at org.apache.lucene.search.spans.SpanNotQuery$SpanNotWeight.getSpans(SpanNotQuery.java:127)
      at org.apache.lucene.search.spans.SpanWeight.scorer(SpanWeight.java:135)
      at org.apache.lucene.search.spans.SpanWeight.scorer(SpanWeight.java:46)
      at org.apache.lucene.search.Weight.bulkScorer(Weight.java:177)
      at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:649)
      at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:443)
      at org.apache.solr.search.SolrIndexSearcher.buildAndRunCollectorChain(SolrIndexSearcher.java:200)
      at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1604)}}The error is actually a bit deeper and can be traced back to the o.a.l.queryparser.complexPhrase.ComplexPhraseQueryParser class.

      Handling this query involves constructing a SpanQuery, which happens in the rewrite method of ComplexPhraseQueryParser. In particular, the expression is decomposed into a BooleanQuery, which has exactly one clause, namely the negative clause -genre:”om*”. The rewrite method then further transforms this into a SpanQuery; in this case, it goes into the path that handles complex queries with both positive and negative clauses. It extracts the subset of positive clauses - note that this set of clauses is empty for this query. The positive clauses are then combined into a SpanNearQuery (around line 340), which is then used to build a SpanNotQuery. Further down the line, the field attribute of the SpanNearQuery is accessed and used as an index into a TreeMap. But since we had an empty set of positive clauses, the SpanNearQuery does not have its field attribute set, so we get a null here - this leads to an exception. A possible fix would be to detect the situation where we have an empty set of positive clauses and include a single synthetic clause that matches either everything or nothing. See attached file 0001-Fix-NullPointerException.patch.

      This bug was found using Diffblue Microservices Testing. Find more information on this test campaign.

        Attachments

        1. home.zip
          376 kB
          Johannes Kloos
        2. 0001-Fix-NullPointerException.patch
          2 kB
          Johannes Kloos

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              jkloos Johannes Kloos
            • Votes:
              1 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated: