一、先说solr
solr的功能、原理什么的就不介绍了,自己找度娘去吧,在这主要说一些特别注意的就好。
特别注意:
1)solr的版本很多,版本的不一样对于实际使用也是不一样的。集成流程会做说明
2)solrcloud的搭建对于版本也是有着不一样的。集成流程会做说明
二、废话不说,上干货
1、先说说环境
Windows8、tomcat8、solr6.6.1、zookeeper3.4.9
2、先说zookeeper 的搭建
解压zookeeper,重命名如下:
忽略我的elastic-service.zip,
zk1、zk2、zk3配置基本一样,就是差一个端口号,主要就以zk1作为列子说明:
data目录下创建文件myid,内容对应,zk1-1、zk2-2、zk3-3
zookeeper-1是解压zookeeper后的文件,重命名了,别问什么,习惯了,
修改zookeeper-1里边conf下的文件
zoo.cfg是copy zoo_sample.cfg得到的,内容修改为:
其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,具体如下:
这个就是我们要用的
主要说说6.0的,解压开压缩包是这样的
解压tomcat以及创建文件夹,我的都是在F:\app\zookeeperserver\solrcloud下边
以6.0+的版本配置
solrconfig:
复制 solr-6.6.1\server\solr\configsets\sample_techproducts_configs\conf 所有文件到此处
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\tomcat1\webapps\solr\WEB-INF 创建classess文件夹
拷贝solr-6.6.1\example\resources下的log文件到这
3份都是这样的,
需要注意的是,tomcat的端口号的修改,每一个都是3处修改,
,修改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
通过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的基本就算集成完事了,
三、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的版本对于使用影响还是很大的,出了当按照正常的流程配置下的,出问题,十有八九都是版本不兼容什么的导致的。