2

我使用 solrj 作为客户端将文档索引到 solr 云中(使用 solr4.5)

我需要根据tenant_id 保存文档,所以我正在尝试进行文档路由。仅当使用numShards参数(http://searchhub.org/2013/06/13/solr-cloud-document-routing/)创建集合时才有可能

我在 solr 云中有两个 solr 实例(example1/solr 和 example2/solr)和在 2181 端口运行的 exrenal zookeeper。

这两个实例都包含名为collection1的集合

我又创建了一个名为newCollection的集合(有两个分片和两个副本),使用 http://localhost:8501/solr/admin/collectionsaction=CREATE&name=newCollection&numShards=2&replicationFactor=2&maxShardsPerNode=2&router.field=id

所以在example1/solr->我有newCollection_shard1_replica1 & newCollection_shard2_replica1,

在 example2/solr -> 我有 newCollection_shard1_replica2 & newCollection_shard2_replica2

我将 example1/solr/collection1/conf 复制到所有分片和副本

我重新启动了 zookeeper 服务器以及 solr 实例:

zookeeper->zkServer.cmd

example1/solr-> java -Dbootstrap_confdir=./solr/newCollection_shard1_replica1/conf -Dcollection.configName=myconf -DzkHost=localhost:2181 -jar start.jar

example2/solr->java -DzkHost=localhost:2181 -jar start.jar

(两个实例运行在不同的端口,一个在 8081,另一个在 8051)


我正在使用 solrj 客户端来索引文档

这是我的示例代码

String url="http://localhost:8081/solr"
ConcurrentUpdateSolrServer solrServer= new ConcurrentUpdateSolrServer(url, 10000, 4);
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "shard1!513");
doc.addField("name", "Santhosh");
solrServer.add(documents);
solrServer.commit();

但是它将文档保存在id shard1!513 的collection1中,solrconfig.xml 中是否需要进行任何配置更改(我使用的是 solr4.5 附带的默认 solrconfig.xml)

如何将文档保存在我的newCollection中?以及如何进行文档路由?

请帮我解决问题。

谢谢!

4

3 回答 3

1

您可以使用 CloudSolrServer 和 UpdateRequest

SolrServer solrServer = new CloudSolrServer(zkHost) // zkHost is your solr zookeeper host string
SolrInputDocument doc = new SolrInputDocument();
UpdateRequest add = new UpdateRequest();
add.add(document);
add.setParam("collection", "newCollection");
add.process(solrServer);

UpdateRequest commit = new UpdateRequest();
commit.setAction(UpdateRequest.ACTION.COMMIT, true, true);
commit.setParam("collection", "newCollection");
commit.process(solrServer);
于 2014-05-01T18:01:52.960 回答
1

我将新集合的核心名称附加到 URL。所以它现在工作正常。

代替:

String url="http://localhost:8081/solr"

我用了:

String url="http://localhost:8081/solr/newCollection_shard1_replica1"
ConcurrentUpdateSolrServer solrServer= new ConcurrentUpdateSolrServer(url, 10000, 4);
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "shard1!513");
doc.addField("name", "Santhosh");
solrServer.add(documents);
solrServer.commit();
于 2013-10-21T07:25:49.133 回答
0

您应该使用 CloudSolrServer http://lucene.apache.org/solr/4_2_1/solr-solrj/org/apache/solr/client/solrj/impl/CloudSolrServer.html

因为在 solrcloud 中,更新必须通过 zookeeper 进行路由,因为 zookeeper 知道云中领导者的状态。还有一件事你不需要将集合名称附加到 url,只需使用 setDefaultCollection(collectionName); CloudSolrServer 将您的更新发送到“collectionName”集合的方法

于 2013-10-28T06:31:49.553 回答