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