docs: private boolean findMatches() throws IOException {
      // check for something in queue of matches
      if (!queueMatches.isEmpty()) {
        return true;
      } else {
        ignoreItem.advanceToDoc(spans.docID());
        while (true) {
          // try to get something in queue of spans
          if (queueSpans.isEmpty() && !collectSpan()) {
            return false;
          }
          // try to get matches with first span in queue
          Match firstMatch = queueSpans.remove(0);
          // create a list of matches with same startPosition as firstMatch
          List<Match> matches = new ArrayList<>();
          matches.add(firstMatch);
          // matches.addAll(expandWithIgnoreItem(spans.docID(), firstMatch));
          // try to collect spans until lastStartPosition not equal to
          // startPosition of firstMatch
          while (!lastSpan && (lastStartPosition == firstMatch.startPosition())) {
            collectSpan();
          }
          while (!queueSpans.isEmpty() && (queueSpans.get(0)
              .startPosition() == firstMatch.startPosition())) {
            Match additionalMatch = queueSpans.remove(0);
            matches.add(additionalMatch);
            matches.addAll(expandWithIgnoreItem(spans.docID(), additionalMatch));
          }
          // construct all matches for this startPosition
          for (Match match : matches) {
            for (int n = (minimumRecurrence - 1); n <= (maximumRecurrence
                - 1); n++) {
              findMatches(match, n);
            }
          }
          // check for something in queue of matches
          if (!queueMatches.isEmpty()) {
            ignoreItem.removeBefore(spans.docID(),
                queueMatches.get(0).startPosition());
            return true;
          }
        }
      }
    }