lucene3.0.3中的SpanFirstQuery

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章