Greg K wrote:
Now, however, I'd like to be able restrict the search to certain documents
in the index, so I don't have to stream through a couple of thousand spans
to produce the 10 excerpts on a subset of the documents.

I've tried added a term to the SpanNearQueries that targets a keyword field
containing the document ids, but SNQ (understandably) can't handle that.
There isn't a SpanBooleanQuery and if I wrap the SpanOrQuery in a
BooleanQuery I'll lose access to the getSpans() method - same if I use a
Filter - can't get spans out of a Hits object, right?

Am I missing something? Is there a straightforward way to do what I'm trying
to do that I'm missing?

I think what you need is a SpanAndQuery, with a constructor like:

   SpanAndQuery(SpanQuery spanQ, Query docsQ);

This would return the subset of spans matching spanQ whose documents match docQ. This should not be too hard to implement. Its Spans implementation might look something like:

private Spans spans;
private Scorer docs;
private boolean more;

public SpanAndSpans(SpanQuery spanQ, Query docQ,
                    IndexReader reader, Searcher searcher) {
  spans = spanQ.getSpans(reader);
  docs = docQ.weight(searcher).scorer(reader);
  more = docs.next();
}

public boolean next() throws IOException {
  if (!more) return false;
  more = spans.next();
  while (more) {
    if (spans.doc() > docs.doc()) {
      more = docs.skipTo(spans.doc());
    } else if (spans.doc() < docs.doc()) {
      more = spans.skipTo(docs.doc());
    } else if (spans.doc() == docs.doc()) {
      return true;
    }
  }
  return false;
}

public boolean skipTo(int doc) throws IOException {
  if (!more) return false;
  more = docs.skipTo(doc);
  return next();
}

This is untested and incomplete, but does it look like the right direction?

Doug

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to