solrcloud+tomcat+zookeeper的集成以及java的调用

一、先说solr

solr的功能、原理什么的就不介绍了,自己找度娘去吧,在这主要说一些特别注意的就好。

特别注意:

    1)solr的版本很多,版本的不一样对于实际使用也是不一样的。集成流程会做说明

    2)solrcloud的搭建对于版本也是有着不一样的。集成流程会做说明

二、废话不说,上干货

1、先说说环境

    Windows8、tomcat8、solr6.6.1、zookeeper3.4.9

2、先说zookeeper 的搭建

    解压zookeeper,重命名如下:

solrcloud+tomcat+zookeeper的集成以及java的调用

忽略我的elastic-service.zip,

zk1、zk2、zk3配置基本一样,就是差一个端口号,主要就以zk1作为列子说明:

solrcloud+tomcat+zookeeper的集成以及java的调用

data目录下创建文件myid,内容对应,zk1-1、zk2-2、zk3-3

zookeeper-1是解压zookeeper后的文件,重命名了,别问什么,习惯了,

修改zookeeper-1里边conf下的文件

solrcloud+tomcat+zookeeper的集成以及java的调用

zoo.cfg是copy  zoo_sample.cfg得到的,内容修改为:

solrcloud+tomcat+zookeeper的集成以及java的调用

其zk1、zk2、zk3基本都是一样的,就是zoo.cfg文件中的clientpoint的端口号不一样。

zk的启动:zk1\zookeeper-1\bin\zkServer.cmd  win启动。

注意: linux的下的启动: sh zkServer.sh start (start 启动,status 状态 ,stop 停止,貌似一般都是直接 kill -9 pid号用了停止了,哈哈)

刚开始启动一个的时候回报错,不用管的,因为是找不到其他的,都启动了就好了。

2、solrcloud的搭建

先说说不同版本的不一样吧,首先最明显的就是搭建的不一样,度娘上低版本的搭建有很多,就不说了,自己可以查查,说句题外话,猴子不上网自己查真是少见哈。最大的不一样就是包的结构变了,貌似是6以上的就没war包了,是一个解压开的文件夹webapp,具体如下:

solrcloud+tomcat+zookeeper的集成以及java的调用

这个就是我们要用的

主要说说6.0的,解压开压缩包是这样的

solrcloud+tomcat+zookeeper的集成以及java的调用

解压tomcat以及创建文件夹,我的都是在F:\app\zookeeperserver\solrcloud下边

solrcloud+tomcat+zookeeper的集成以及java的调用

以6.0+的版本配置

        solrconfig:

        复制 solr-6.6.1\server\solr\configsets\sample_techproducts_configs\conf  所有文件到此处

solrcloud+tomcat+zookeeper的集成以及java的调用

        solrhome:

                复制solr-6.6.1\server\solr下所有文件到这

tomcat:solr-6.6.1\server\solr-webapp ,拷贝到tomcat/webapp下,修改名称为solr
拷贝jar包:(拷贝到solr\WEB-INF\lib)
solr-6.6.1\dist:solr-dataimporthandler开头的两个,
solr-6.6.1\server\lib\ext:所有的jar
solr-6.6.1\server\lib: metrics开头的jar
solr-6.6.1\server\solr-webapp\webapp\WEB-INF 修改web.xml文件

配置solrhome的路径,注释掉权限

solrcloud+tomcat+zookeeper的集成以及java的调用

                        在solrcloud\tomcat1\webapps\solr\WEB-INF  创建classess文件夹

                        拷贝solr-6.6.1\example\resources下的log文件到这

3份都是这样的,

需要注意的是,tomcat的端口号的修改,每一个都是3处修改,

solrcloud+tomcat+zookeeper的集成以及java的调用

solrcloud+tomcat+zookeeper的集成以及java的调用

solrcloud+tomcat+zookeeper的集成以及java的调用

,修改solrhome的solr.xml文件,端口号对应tomcat的

基本的修改就算完成了,

开始修改启动修改:

修改tomcat的每一个catalina.bat,(路径:solrcloud\tomcat1\bin)

tomcat1:

set java_opts=-Dsolr.home=F:\app\zookeeperserver\solrcloud\solrhome1 -Dbootstrap_confdir=F:\app\zookeeperserver\solrcloud\solrconf -Dcollection.configName=myconf -DnumShards=2 -DzkHost=127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

tomcat2:

set JAVA_OPTS=-Dsolr.home=F:\app\zookeeperserver\solrcloud\solrhome2 -DzkHost=127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

tomcat3:

set JAVA_OPTS=-Dsolr.home=F:\app\zookeeperserver\solrcloud\solrhome3 -DzkHost=127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

完事就是启动了,tomcat 的bin目录下的   startup.bat

solrcloud+tomcat+zookeeper的集成以及java的调用


通过coreadmin创建collection

创建
http://127.0.0.1:8080/solr/admin/collections?action=CREATE&name=collection1&numShards=3&replicationFactor=2&maxShardsPerNode=2&collection.configName=myconf
重新加载接口
http://127.0.0.1:8080/solr/admin/collections?action=RELOAD&name=collection1
删除

http://127.0.0.1:8080s/solr/admin/collections?action=DELETE&name=collection1

操作完事后的:

solrcloud+tomcat+zookeeper的集成以及java的调用


solrcloud的基本就算集成完事了,


三、java使用solrcloud

调用参考的:http://geek.csdn.net/news/detail/90938

由于参考的使用solr的版本不一样,做了修改,贴出我的代码:

我用的是6.6.1,

package utils;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
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;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;

public class SolrCloud {
    // 低版本的使用
    //private static CloudSolrServer cloudSolrServer;
    private static CloudSolrClient cloudSolrClient;
    private static synchronized CloudSolrClient getCloudSolrServer(final String zkHost) {
        if (cloudSolrClient == null) {
            try {
                //cloudSolrServer = new CloudSolrServer(zkHost);
                cloudSolrClient = new CloudSolrClient(zkHost);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return cloudSolrClient;
    }
    
    //添加索引
    private void addIndex(SolrClient solrServer) {
        try {
            SolrInputDocument doc1 = new SolrInputDocument();
            doc1.addField("id", "421245251215121452521251");
            doc1.addField("title", "张三");
            SolrInputDocument doc2 = new SolrInputDocument();
            doc2.addField("id", "4224558524254245848524243");
            doc2.addField("title", "李四");
            
            SolrInputDocument doc3 = new SolrInputDocument();
            doc3.addField("id", "4543543458643541324153453");
            doc3.addField("title", "王五");
            
            Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
            docs.add(doc1);
            docs.add(doc2);
            docs.add(doc3);
            
            solrServer.add(docs);
            solrServer.commit();
            
        } catch (SolrServerException e) {
            System.out.println("Add docs Exception !!!");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("Unknowned Exception!!!!!");
            e.printStackTrace();
        }
        
    }
    
    // 搜索
    public void search(SolrClient solrServer, String String) {
        SolrQuery query = new SolrQuery();
        query.setQuery(String);
        try {
            QueryResponse response = solrServer.query(query);
            SolrDocumentList docs = response.getResults();
            for (SolrDocument doc : docs) {
                for (Map.Entry<String, Object> entry : doc) {
                    System.out.println(entry.getKey() + "=" + entry.getValue());
                }
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("Unknowned Exception!!!!");
            e.printStackTrace();
        }
    }
    
    //删除
    public void deleteAllIndex(SolrClient solrServer) {
        try {
            solrServer.deleteByQuery("*:*");// delete everything!
            solrServer.commit();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("Unknowned Exception !!!!");
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws IOException {
        final String zkHost = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";
        final String defaultCollection = "collection1";
        final int zkClientTimeout = 20000;
        final int zkConnectTimeout = 10000;
        // 低版本的使用
        //CloudSolrServer cloudSolrServer = getCloudSolrServer(zkHost);
    
        CloudSolrClient cloudSolrClient = getCloudSolrServer(zkHost);
        
        System.out.println("The Cloud SolrServer Instance has benn created!");
        // 低版本的使用
//        cloudSolrServer.setDefaultCollection(defaultCollection);
//        cloudSolrServer.setZkClientTimeout(zkClientTimeout);
//        cloudSolrServer.setZkConnectTimeout(zkConnectTimeout);
//        cloudSolrServer.connect();
        cloudSolrClient.setDefaultCollection(defaultCollection);
        cloudSolrClient.setZkClientTimeout(zkClientTimeout);
        cloudSolrClient.setZkConnectTimeout(zkConnectTimeout);
        cloudSolrClient.connect();
        System.out.println("The cloud Server has been connected !!!!");
        SolrCloud test = new SolrCloud();
        // 低版本的使用
//        test.addIndex(cloudSolrServer);
//        test.search(cloudSolrServer, "id:*");
//        test.deleteAllIndex(cloudSolrServer);
//        test.search(cloudSolrServer, "id:*");
        test.addIndex(cloudSolrClient);
        //test.search(cloudSolrClient, "id:*");
        //test.deleteAllIndex(cloudSolrClient);
        //test.search(cloudSolrClient, "id:*");
        System.out.println("hashCode" + test.hashCode());
        cloudSolrClient.close();
    }
    
    
}

mavne的依赖用的是:

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>6.6.1</version>
</dependency>

注意:版本的不一样可能会出现找不到collection的异常信息。

参考:https://blog.csdn.net/z56zzzz/article/details/77530889


来个总结哈:

solr的版本对于使用影响还是很大的,出了当按照正常的流程配置下的,出问题,十有八九都是版本不兼容什么的导致的。


solrcloud+tomcat+zookeeper的集成以及java的调用