通过Java来操作Solr的集群,可以说和单机的模式都差不多,只是连接的对象是zookeeper服务器了,而不是直接连接的solr服务器。通过CloudSolrServer 连连接服务器,设定操作的集合Collection。然后其他的就和单机的一样了,问题点是,集群的,不能直接将所有的数据都查出,。。。尴尬了

Solr之java操作集群 -yellowcong_数据

给集群的Solr添加索引

public static void index() throws Exception {

    // 路径是zookeeper的服务的路径
    CloudSolrServer server = new CloudSolrServer(ZK_HOST);

    // 设置默认的collection
    server.setDefaultCollection("collection3");

    //添加集合
    for(int i=0;i<100;i++) {
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id", UUID.randomUUID().toString());
        doc.addField("username", "yellowcong"+i);
        doc.addField("content", "我是逗比聪"+i);
        doc.addField("title", "逗比聪"+i);
        server.add(doc);
    }

    //提交事物
    server.commit();
    System.out.println("------------------------添加索引---------------------");
}

删除索引

public static void deleteAll() throws Exception {
    CloudSolrServer server = new CloudSolrServer(ZK_HOST);

    // 设置默认的collection
    server.setDefaultCollection("collection3");

    //清空数据
    server.deleteByQuery("*:*");

    //提交事物
    server.commit();

    System.out.println("------------------------数据清空---------------------");
}

查询索引

SolrQuery .setRows(Integer.MAX_VALUE) ,这个有问题,会报错
而且集群了,由于是单机的环境,所以查询起来,特别的慢。。。。

public static void query() throws Exception {
    CloudSolrServer server = new CloudSolrServer(ZK_HOST);

    // 设置默认的collection
    server.setDefaultCollection("collection3");

    SolrQuery query = new SolrQuery();
    query.add("q","title:逗");
    query.setStart(0);
    //query.setRows(Integer.MAX_VALUE);
    query.setRows(10);

    QueryResponse resp = server.query(query);

    //ArrayList<SolrDocument>
    SolrDocumentList docs = resp.getResults();
    System.out.printf("查询到了%d条数据\r\n",docs.getNumFound());;

    for(SolrDocument doc:docs) {
        String id = doc.get("id").toString();
        String username = doc.get("username").toString();
        String content = doc.get("content").toString();
        String title = doc.get("title").toString();
        System.out.printf("%s:%s:%s:%s\r\n",id,username,content,title);
    }

}

查询结果
Solr之java操作集群 -yellowcong_其他_02

添加到spring

<!-- 集群版 --> 
<bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
    <constructor-arg name="zkHost" value="192.168.66.100:2181,192.168.66.100:2182,192.168.66.100:2183"></constructor-arg>   
    <property name="defaultCollection" value="collection3"></property>  
</bean>

够着函数注入host
Solr之java操作集群 -yellowcong_solr_03

属性注入
Solr之java操作集群 -yellowcong_数据_04

完整代码

package com.yellowcong.day12_06;

import java.util.UUID;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;

/** * * 作者:yellowcong <br/> * 日期:2017/12/06 <br/> * 時間:16:15:39 <br/> * 描述: */
public class Demo {
      
        
    // 创建一个和solr集群的连接
    // 参数就是zookeeper的地址列表,使用逗号分隔
    private static final String ZK_HOST = "192.168.66.100:2181,192.168.66.100:2182,192.168.66.100:2183";

    public static void main(String[] args) throws Exception {

        //删除所有索引
        //deleteAll();

        //添加索引
        //index();

        //查询数据
         query() ;
    }

    /** * 作者:yellowcong <br/> * 日期:2017/12/06 <br/> * 時間:16:34:07 <br/> * 描述:删除所有索引 * @throws Exception */
    public static void deleteAll() throws Exception {
        CloudSolrServer server = new CloudSolrServer(ZK_HOST);

        // 设置默认的collection
        server.setDefaultCollection("collection3");

        //清空数据
        server.deleteByQuery("*:*");

        //提交事物
        server.commit();

        System.out.println("------------------------数据清空---------------------");
    }
    /** * 作者:yellowcong <br/> * 日期:2017/12/06 <br/> * 時間:16:31:53 <br/> * 描述:检索数据 * @throws Exception */
    public static void query() throws Exception {
        CloudSolrServer server = new CloudSolrServer(ZK_HOST);

        // 设置默认的collection
        server.setDefaultCollection("collection3");

        SolrQuery query = new SolrQuery();
        query.add("q","title:逗");
        query.setStart(0);
        //query.setRows(Integer.MAX_VALUE);
        query.setRows(10);

        QueryResponse resp = server.query(query);

        //ArrayList<SolrDocument>
        SolrDocumentList docs = resp.getResults();
        System.out.printf("查询到了%d条数据\r\n",docs.getNumFound());;

        for(SolrDocument doc:docs) {
            String id = doc.get("id").toString();
            String username = doc.get("username").toString();
            String content = doc.get("content").toString();
            String title = doc.get("title").toString();
            System.out.printf("%s:%s:%s:%s\r\n",id,username,content,title);
        }

    }
    /** * 作者:yellowcong <br/> * 日期:2017/12/06 <br/> * 時間:16:25:43 <br/> * 描述:添加索引 * @throws Exception */
    public static void index() throws Exception {

        // 路径是zookeeper的服务的路径
        CloudSolrServer server = new CloudSolrServer(ZK_HOST);

        // 设置默认的collection
        server.setDefaultCollection("collection3");

        //添加集合
        for(int i=0;i<100;i++) {
            SolrInputDocument doc = new SolrInputDocument();
            doc.addField("id", UUID.randomUUID().toString());
            doc.addField("username", "yellowcong"+i);
            doc.addField("content", "我是逗比聪"+i);
            doc.addField("title", "逗比聪"+i);
            server.add(doc);
        }

        //提交事物
        server.commit();
        System.out.println("------------------------添加索引---------------------");
    }
}

错误合集

No live SolrServers available to handle this request

导致这个问题的原因是,我设定查询数据为所有数据,所导致的。。。SolrQuery .setRows(Integer.MAX_VALUE),不能直接查询所有数据,这点请注意。

Exception in thread "main" org.apache.solr.client.solrj.SolrServerException: No live SolrServers available to handle this request:[http://192.168.66.100:8083/solr/collection3_shard1_replica1, http://192.168.66.100:8081/solr/collection3_shard1_replica2, http://192.168.66.100:8082/solr/collection3_shard1_replica3]
    at org.apache.solr.client.solrj.impl.LBHttpSolrServer.request(LBHttpSolrServer.java:337)
    at org.apache.solr.client.solrj.impl.CloudSolrServer.request(CloudSolrServer.java:623)
    at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:90)
    at org.apache.solr.client.solrj.SolrServer.query(SolrServer.java:301)
    at com.yellowcong.day12_06.Demo.query(Demo.java:76)

Solr之java操作集群 -yellowcong_其他_05