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有啥用。。。