近期一直在使用SolrCloud,乘著酒醉大概總結一下。
1.安裝
原來一直有個誤區,認為SolrCloud啟動時,必須至少有個core才可以,其實不然。
首先按照Solr官方wiki上正常部署Solr,然後在Tomcat的啟動引數中加入以下引數:
如果使用內建的zookeeper:-DzkRun -DzkHost=localhost:9080。對於DzHost,可以是多個地址,用逗號分割,埠是Tomcat的埠+1000。一般Tomcat的埠是8080,所以這裡是9080。
如果使用外部的zookeeper:-DzkHost={ip:port}
對於這兩種情況,使用多個zookeeper時,多需要修改zoo.cfg檔案,比如我有三個zookeeper,zoo.cfg內容如下:
server.1={ip:2888:3888}
server.2={ip:2888:3888}
server.3={ip:2888:3888}
Solr正常啟動後,對於solr 4.5以前的版本,開啟Solr Admin管理介面是有錯誤提示的,可以忽略,對於最新發布的Solr 4.5是沒有錯誤提示的。
2.上傳SolrCloud Collection檔案
java -cp "C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\solr.patent.com\solr\WEB-INF\lib\*" org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost 127.0.0.1:9080 -confdir {Solr Collection配置檔案地址} -confname {自定義的Solr Collection 配置名稱}
可以上傳多個配置。
3.建立Collection
http://localhost:8080/solr/admin/collections?action=CREATE&name={Collection名稱}&numShards={分片數量}&collection.configName={指定的Collection配置檔名稱}
建立完Collection後,對於Solr 4.5以前版本來說,就可以正常開啟Solr Admin管理介面來說。對於最新發布的Solr 4.5,通過測試,是有Bug的(我已經提交給Apache Solr),修改CoreAdminHandler,在第453行下加入以下程式碼:
String opts = params.get(CoreAdminParams.CONFIG); CloudDescriptor cd = dcore.getCloudDescriptor(); if (cd != null) { cd.setParams(req.getParams()); opts = params.get(CoreAdminParams.COLLECTION); if (opts != null) cd.setCollectionName(opts); opts = params.get(CoreAdminParams.SHARD); if (opts != null) cd.setShardId(opts); opts = params.get(CoreAdminParams.SHARD_RANGE); if (opts != null) cd.setShardRange(opts); opts = params.get(CoreAdminParams.SHARD_STATE); if (opts != null) cd.setShardState(opts); opts = params.get(CoreAdminParams.ROLES); if (opts != null) cd.setRoles(opts); opts = params.get(CoreAdminParams.CORE_NODE_NAME); if (opts != null) cd.setCoreNodeName(opts); Integer numShards = params.getInt(ZkStateReader.NUM_SHARDS_PROP); if (numShards != null) cd.setNumShards(numShards); }
4.建立索引
示例程式碼如下(scala編寫):
val cloudServer = new CloudSolrServer({zookeeper地址}) cloudServer.setDefaultCollection("{預設Collection名稱}") cloudServer.setParser(new BinaryResponseParser()) val updateRequest = new UpdateRequest() updateRequest.setParam("collection", "{要更新的Collection名稱}") updateRequest.add({更新的文件}) updateRequest.process(cloudServer)
5.查詢
示例程式碼如下(scala編寫):
val cloudServer = new CloudSolrServer({zookeeper地址}) cloudServer.setDefaultCollection("{預設Collection名稱}") cloudServer.setParser(new BinaryResponseParser() val response = new QueryRequest(solrQuery, METHOD.POST).process(cloudServer) val result = response.getResults()
總體來說SolrCloud使用起來各方面還是不錯的,期待5.0的釋出!