On the living github version of LUCENE-5317, I'm trying to migrate to 6.0, and 
most is fairly clear.

However, how do I modify the following code to return spans only from documents 
that match the -Filter- Query.

For each LeafReaderContext, I used to get a DocIdSet, call the iterator on 
that, and then iterate through the DocIdSetIterator along with the spans to 
retrieve spans in documents matching the Filter.


for (LeafReaderContext ctx : searcher.getIndexReader().leaves()) {
  DocIdSet filterSet = filter.getDocIdSet(ctx, ctx.reader().getLiveDocs());
  if (filterSet == null) {
    return;
  }

  Spans spans = w.getSpans(ctx, SpanWeight.Postings.POSITIONS);
  if (spans == null) {
    continue;
  }
  DocIdSetIterator filterItr = filterSet.iterator();

.....
}

And then iterate through the filterItr and spans like so...


while (true) {
  if (spansDoc == DocIdSetIterator.NO_MORE_DOCS) {
    break;
  }
  filterDoc = filterItr.advance(spansDoc);
  if (filterDoc == DocIdSetIterator.NO_MORE_DOCS) {
    break;
  } else if (filterDoc > spansDoc) {
    while (spansDoc <= filterDoc) {
      spansDoc = spans.nextDoc();
      if (spansDoc == filterDoc) {
        boolean cont = visit(leafCtx, spans, visitor);
        if (! cont) {
          return false;
        }

      } else {
        continue;
      }
    }
  } else if (filterDoc == spansDoc) {
    boolean cont = visit(leafCtx, spans, visitor);
    if (! cont) {
      return false;
    }
    //then iterate spans
    spansDoc = spans.nextDoc();
  } else if (filterDoc < spansDoc) {
    throw new IllegalArgumentException("FILTER doc is < spansdoc!!!");
  } else {
    throw new IllegalArgumentException("Something horrible happened");
  }


Reply via email to