查询是分为query阶段、fetch阶段和expand阶段,共3个阶段。重点是前2个阶段。在上篇文章说的是query阶段,接下来说fetch阶段。
fetch是要解析query阶段的result的
//比如有5个分片,当所有的分片都查询完后,开始进入下一个阶段
private void successfulShardExecution(SearchShardIterator shardsIt) {
final int remainingOpsOnIterator;
if (shardsIt.skip()) {
remainingOpsOnIterator = shardsIt.remaining();
} else {
remainingOpsOnIterator = shardsIt.remaining() + 1;
}
final int xTotalOps = totalOps.addAndGet(remainingOpsOnIterator);
if (xTotalOps == expectedTotalOps) {
//就是在这里开始进入下一个阶段
onPhaseDone();
}
}
//this的名字是 query 表示query阶段。这个方法正式从query进入fetch
final void onPhaseDone() { // as a tribute to @kimchy aka. finishHim()
executeNextPhase(this, getNextPhase(results, this));
}
/