我正在使用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,希望这会有所帮助,但这会导致其他错误。
有什么建议吗?
答案 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";