简单的方法
使用CloudSolrServer执行分布式查询。向它提供 Zookeeper url 和集合名称(在响应构建器中可用):
CoreDescriptor coreDescriptor = rb.req.getCore().getCoreDescriptor();
String collectionName = coreDescriptor.getCloudDescriptor().getCollectionName();
ZkController zkController = coreDescriptor.getCoreContainer().getZkController();
String zookeeperUrl = zkController.getZkServerAddress();
CloudSolrServer server = new CloudSolrServer(zookeeperUrl);
server.setDefaultCollection(collectionName);
server.connect();
SolrRequest request = ... //initialize the solr request to execute the query
NamedList<Object> solrResponse = server.request(solrRequest);
// do whatever you like with the returned response;
server.shutdown();
正确的方式
不要在 prepare 方法中执行分布式搜索。不要在 prepare 方法中查询索引。您要做的是首先决定您希望在哪个执行阶段执行分布式查询。阶段是STAGE_START
、STAGE_PARSE_QUERY
、STAGE_TOP_GROUPS
、STAGE_EXECUTE_QUERY
和STAGE_GET_FIELDS
。STAGE_DONE
如果您需要它在两个阶段之间执行,则创建一个新的中间阶段(例如EXECUTE_PREPARING_QUERY
)。
覆盖该distributedProcess
方法并以这样的方式实现它,如果当前阶段是您的阶段,则为分片请求设置正确的参数:
@Override public int distributedProcess(ResponseBuilder rb) {
...
if (rb.stage == MY_STAGE) {
ShardRequest sreq = new ShardRequest();
sreq.purpose = ShardRequest.PURPOSE_PRIVATE;
sreq.params = new ModifiableSolrParams();
// set the parameters for the shard request
rb.addRequest(this, sreq);
}
...
}
现在每个分片都将执行由您在其自己的核心上设置的参数定义的请求。这将发生在舞台上MY_STAGE
。您仍然必须处理碎片的响应,将它们组合并使用它们。处理所有这些响应的正确位置是在handleResponses
组件的方法中。handleResponses
因此,如果您处于正确的阶段,请覆盖并执行您需要对分片响应执行的任何操作。您可能需要将它们保存在某个地方,以便稍后在该finishStage
方法中引用它们。
@Override public void handleResponses(ResponseBuilder rb, ShardRequest sreq) {
...
if (stage == MY_STAGE) {
List<ShardResponse> responses = sreq.responses;
for (ShardResponse response : responses) {
//do something with the response, maybe save it somewhere
rb.finished.remove(sreq);
}
}
...
}
现在您必须重写该finishStage
方法并对组合结果执行您需要做的任何事情。
@Override public void finishStage(ResponseBuilder rb) {
...
if (rb.stage == MY_STAGE) {
// do whatever you need to do with the results
}
...
}
重要的信息是使用响应构建器阶段来控制组件相对于其他组件的执行流程。如果您希望在执行实际查询之前执行代码,则不必将代码放在 prepare 方法中。您只需要创建或使用一个介于STAGE_START
和之间的阶段STAGE_EXECUTE_QUERY
。