SolrCloud攻略
近期一直在使用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行下加入以下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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编写):
1
2
3
4
5
6
7
|
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编写):
1
2
3
4
5
|
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的发布!