SpanFirstQuery是一个很简单的SpanQuery,在根据spans进行召回doc的时候,他会判断当前出现的位置是否满足一定的条件——出现的是不是在指定的end之前,如果是的话说明当前的位置是符合要求的,否则会继续读取下一个位置。我们看一下他的getSpans方法
@Override
public Spans getSpans(final IndexReader reader) throws IOException {
return new Spans() {
private Spans spans = match.getSpans(reader);//获得封装的SpanQuery的span,返回的spans是这个spans的代理。
/** 这个spanquery唯一最重要的地方就是这里,只有某个term出现的位置不能超过指定的end的值才算是当前的doc合格。 */
@Override
public boolean next() throws IOException {
while (spans.next()) { // scan to next match
if (end() <= end)//只要当前的位置不是小于end则继续循环位置,直到所有的位置都循环完或者某个位置小于end
return true;
}
return false;
}
@Override //移动到不小于指定的docid得位置
public boolean skipTo(int target) throws IOException {
if (!spans.skipTo(target))
return false;
return spans.end() <= end || next();
}
//其他的方法都是直接调用的spans的方法。
@Override
public int doc() {
return spans.doc();
}
@Override
public int start() {
return spans.start();
}
@Override
public int end() {
return spans.end();
}
// TODO: Remove warning after API has been finalized
@Override
public Collection<byte[]> getPayload() throws IOException {
ArrayList<byte[]> result = null;
if (spans.isPayloadAvailable()) {
result = new ArrayList<byte[]>(spans.getPayload());
}
return result;// TODO: any way to avoid the new construction?
}
// TODO: Remove warning after API has been finalized
@Override
public boolean isPayloadAvailable() {
return spans.isPayloadAvailable();
}
@Override
public String toString() {
return "spans(" + SpanFirstQuery.this.toString() + ")";
}
};
}
我也不知道这个spanquery有啥用。。。