首先,我们肯定是要先搭建好Solr集群的,关于Solr集群的搭建,我的《淘淘商城第59讲——搭建Solr集群,注意是Solr 7.1.0这个版本的哟!》这篇博客已经做了非常详细的讲解,大家可以参考一下。
其次,刚搭建好的Solr集群,是没有任何索引数据的,如下图所示。
接下来,我们就使用SolrJ来管理Solr集群。首先看看怎么向索引库中添加文档,我们在taotao-search-service工程的src/test/java目录下的com.taotao.search.test包中新建一个SolrCloudTest单元测试类,并编写一个测试方法,如下图所示。
为方便大家复制,现把以上SolrCloudTest单元测试类的代码贴出,如下所示。
package com.taotao.search.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
public class SolrCloudTest {
@Test
public void testAdd() throws Exception {
// 1. 创建一个SolrClient对象,需要使用到CloudSolrClient子类,即集群版的实现类
// 创建一个List集合,并添加以Zookeeper集群节点IP地址及端口号这样色的作为其中的元素
List<String> zkHosts = new ArrayList<String>();
zkHosts.add("192.168.81.134:2181");
zkHosts.add("192.168.81.134:2182");
zkHosts.add("192.168.81.134:2183");
Optional<String> zkChroot = Optional.of("/");
CloudSolrClient cloudSolrClient = new CloudSolrClient.Builder(zkHosts, zkChroot).build();
// 2. 设置默认的搜索的Collection,即设置默认的索引库(注意,不是我们的Core所对应的索引库,而是指整个Colletion索引集合)
cloudSolrClient.setDefaultCollection("collection2");
// 3. 创建SolrInputDocument对象
SolrInputDocument document = new SolrInputDocument();
// 4. 添加域到文档中
document.addField("id", "91porn");
document.addField("item_title", "来了,就是91人");
// 5. 将文档提交到索引库中
cloudSolrClient.add(document);
// 6. 提交
cloudSolrClient.commit();
}
}
执行以上testAdd方法,你很有可能会发现Eclipse控制台打印出了这样一个异常信息,截图如下。
为了方便大家看清这个异常的详细信息,我便将其复制出来了,如下所示。
org.apache.solr.common.SolrException: java.util.concurrent.TimeoutException: Could not connect to ZooKeeper 192.168.81.134:2181,192.168.81.134:2182,192.168.81.134:2183 within 15000 ms
at org.apache.solr.common.cloud.SolrZkClient.<init>(SolrZkClient.java:202)
at org.apache.solr.common.cloud.SolrZkClient.<init>(SolrZkClient.java:126)
at org.apache.solr.common.cloud.SolrZkClient.<init>(SolrZkClient.java:116)
at org.apache.solr.common.cloud.ZkStateReader.<init>(ZkStateReader.java:356)
at org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider.getZkStateReader(ZkClientClusterStateProvider.java:175)
at org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider.connect(ZkClientClusterStateProvider.java:160)
at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.connect(BaseCloudSolrClient.java:335)
at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.requestWithRetryOnStaleState(BaseCloudSolrClient.java:848)
at org.apache.solr.client.solrj.impl.BaseCloudSolrClient.request(BaseCloudSolrClient.java:838)
at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:211)
at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:177)
at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:138)
at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:156)
at com.taotao.search.test.SolrCloudTest.testAddDocument(SolrCloudTest.java:71)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.util.concurrent.TimeoutException: Could not connect to ZooKeeper 192.168.81.134:2181,192.168.81.134:2182,192.168.81.134:2183 within 15000 ms
at org.apache.solr.common.cloud.ConnectionManager.waitForConnected(ConnectionManager.java:249)
at org.apache.solr.common.cloud.SolrZkClient.<init>(SolrZkClient.java:193)
... 36 more
这个异常信息说的是啥啊?为什么会报这个异常啊?又如何解决这个异常呢?带着这些疑问请看我写的这篇文章吧!——《淘淘商城第64讲——使用SolrJ管理Solr集群时,给我报了这样一个异常:org.apache.solr.common.SolrException ···》
下面我们来看看如何从索引库中删除文档,就把刚才向索引库中添加的文档删除掉,如何做到这一点呢?在SolrCloudTest单元测试类中再编写一个测试方法,如下图所示。
为方便大家复制,现把以上SolrCloudTest单元测试类中testDelete方法的代码贴出,如下所示。
// 删除文档
@Test
public void testDelete() throws Exception {
// 1. 创建一个SolrClient对象,需要使用到CloudSolrClient子类,即集群版的实现类
// 创建一个List集合,并添加(http://Zookeeper集群节点IP地址:端口号)作为其中的元素
List<String> solrUrls = new ArrayList<String>();
solrUrls.add("http://192.168.81.134:8180/solr");
solrUrls.add("http://192.168.81.134:8280/solr");
solrUrls.add("http://192.168.81.134:8380/solr");
solrUrls.add("http://192.168.81.134:8480/solr");
CloudSolrClient cloudSolrClient = new CloudSolrClient.Builder(solrUrls).build();
// 2. 设置默认的搜索的Collection,即设置默认的索引库(注意,不是我们的Core所对应的索引库,而是指整个Colletion索引集合)
cloudSolrClient.setDefaultCollection("collection2");
// 3. 根据id删除文档
cloudSolrClient.deleteById("testcloudid");
// 4. 提交
cloudSolrClient.commit();
}
以上方法执行成功后,我们访问任意一个Solr节点,然后去查询一下所有文档,继而就可以发现我们刚才添加的文档已经被删除掉了。