如何使用solrj索引特定分片中的数据

时间:2013-10-20 15:17:39

标签: solr solrj solrcloud

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

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

我在solr cloud中有两个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

例1 / 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();

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

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

请帮我解决问题。

谢谢!

3 个答案:

答案 0 :(得分:1)

我将新Collection的Core名称附加到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();

答案 1 :(得分: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);

答案 2 :(得分: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'集合

的方法