如何在SolrCloud中混淆/导出requestHandler以使用所有分片

时间:2016-12-23 17:38:43

标签: solr solrj solrcloud

我正在使用solr 4.10.2。我有一个/ export处理程序工作来导出大型数据集。当我将配置部署到我的solr集群环境中时,我注意到导出功能缺少一些记录。

如果我通过/ select和/ export运行相同的查询字符串,我会在/ export调用中获得更少的记录。

为了让/ export在SolrCloud环境中工作,您需要做些什么特别的事情吗?

  <requestHandler name="/export" class="solr.SearchHandler">
    <lst name="invariants">
      <str name="rq">{!xport}</str>
      <str name="wt">xsort</str>
      <str name="distrib">false</str>
    </lst>

    <arr name="components">
      <str>query</str>
    </arr>
  </requestHandler>

我尝试将“distrib”属性更改为true,希望这会有所帮助,但这会导致其他错误。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

/export端点仅与本地节点相关,但Streaming Expressions API(在/stream下可用,无需任何进一步配置)构建在/export端点之上并且意味着是云的替代品。

这也允许您在请求时处理内容(如果适用)。

/stream所需的参数与/ export相同。

但是因为你在4.10.2上,所以你必须从Zookeeper请求clusterstate.json然后在本地合并结果之前自己查询每个节点。

您可以通过连接到Zookeeper来检索此文件:

zkCli.sh -server ip:2181

然后检索clusterstate:

get /clusterstate.json

您将找到每个集合的分片列表及其副本,然后您可以迭代这些值并从每个服务器上的/export处理程序中检索结果。

答案 1 :(得分:0)

以下是一些可以获得上述内容的代码:

final CloudSolrServer server = new CloudSolrServer(zooKeeperEndpoint);
server.connect();
final ClusterState clusterState = server.getZkStateReader().getClusterState();
// and get the leader of the collection...
Replica leader1 = clusterState.getLeader("search_index", "shard1");
Replica leader2 = clusterState.getLeader("search_index", "shard2");
Replica leader3 = clusterState.getLeader("search_index", "shard3");

List<String> listOfNodes = new ArrayList<String>();
listOfNodes.add((String) leader1.get("core"));
listOfNodes.add((String) leader2.get("core"));
listOfNodes.add((String) leader3.get("core"));

然后遍历调用solr索引的每个核心的列表:

String solrURL = "http://mysolrserver/solr" + "/" + nodeEndpoint + "/export?q=*:*" + "&fq=text:\"*SEARCHSTRING*\"&fl=field1,field2&sort=sortFieldId asc";