淘淘商城第63讲——使用SolrJ管理Solr集群

首先,我们肯定是要先搭建好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节点,然后去查询一下所有文档,继而就可以发现我们刚才添加的文档已经被删除掉了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李阿昀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值