我使用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 中保存文档?以及如何进行文档路由?
请帮我解决问题。
谢谢!
答案 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'集合
的方法