您如何在 SolrCloud 中配置/导出 requestHandler 以使用所有分片

How do you confiugre /export requestHandler in SolrCloud to use all shards

我正在使用 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 希望这会有所帮助,但这导致了其他错误。

有什么建议吗?

/export端点仅与本地节点相关,但Streaming Expressions API(在/stream下可用,无需任何进一步配置)建立在[=12=之上] 端点,旨在成为云的替代方案。

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

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

但是由于您使用的是 4.10.2,因此您将不得不从 Zookeeper 请求 clusterstate.json,然后在本地合并结果之前自行查询每个节点。

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

zkCli.sh -server ip:2181

然后检索集群状态:

get /clusterstate.json

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

这里有一些代码可以得到上面描述的内容:

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";