solr7.1.0学习笔记(12)---Solr客户端SolrJ的运用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39082031/article/details/79077784

SolrJ是solr众多客户端中最普通最常用的,啥也不说了,具体看代码:

1、创建maven工程,也可以不是maven,用maven只是为了管理项目方便,仅此而已;

2、既然创建的是maven工程,那么,就不得不说说 pom.xml 文件,pom.xml 中主要管理的就是依赖和插件,那么既然是 solr 客户端 solrj ,那么就一定要有 solrj 的 jar 包,下面是我的完整的 pom.xml,本来是想把 solrj 和Spring/SpringMVC整合在一起,形成一个完整的 web 工程,所以, pom.xml 文件就相对比较完整一些,不过内容虽多,但都有明确的注释,请看:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.wolfhome.hibernate</groupId>
	<artifactId>solrtest</artifactId>
	<packaging>war</packaging>
	<version>1.0</version>

	<!-- 依赖版本 -->
	<properties>
		<spring-version>4.3.2.RELEASE</spring-version>
		<releasetrain-version>Hopper-SR3</releasetrain-version>
	</properties>

	<!-- 依赖版本控制 -->
	<dependencyManagement>
		<dependencies>
			<!-- spring-framework-bom 解决spring不同模块的版本问题, 引入了spring-framework-bom后,后面引入的所有的spring依赖就不用声明version属性了, 
				和spring-framework-bom是一个版本 -->
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-framework-bom</artifactId>
				<version>${spring-version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.data</groupId>
				<artifactId>spring-data-releasetrain</artifactId>
				<version>${releasetrain-version}</version>
				<scope>import</scope>
				<type>pom</type>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<dependencies>
		<!-- servlet&jsp -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
		</dependency>
		<!-- JSP-api -->
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.2</version>
		</dependency>
		<!-- JAVA标准标签库 高版本不需要jstl -->
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>1.1.2</version>
		</dependency>
		<!-- spring相关依赖 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
		</dependency>
		<!-- springweb依赖jar -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
		</dependency>
		<!-- springmvc依赖jar -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
		</dependency>
		<!-- spring-aop -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
		</dependency>
		<!-- spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
		</dependency>
		<!-- spring-tx -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
		</dependency>
		<!-- 数据源:c3p0 -->
		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.1.2</version>
		</dependency>
		<!-- mysql驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.38</version>
		</dependency>
		<!-- myBatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.5</version>
		</dependency>
		<!-- spring整合myBatis插件 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.1</version>
		</dependency>
		<!-- spring对测试框架的支持 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- junit单元测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<!--jsckson插件 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>2.5.0</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.5.0</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.5.0</version>
		</dependency>
		<!-- 文件上传与下载 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.5</version>
		</dependency>
		<!-- 日志处理 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.25</version>
		</dependency>
		<!-- 发送http请求 -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.5.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpmime</artifactId>
			<version>4.5.2</version>
		</dependency>
		<!-- solr/solr-solrj -->
		<dependency>
			<groupId>org.apache.solr</groupId>
			<artifactId>solr-solrj</artifactId>
			<version>7.1.0</version>
		</dependency>
		<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>
	</dependencies>
	<build>
		<finalName>solrtest</finalName>
		<plugins>
			<!-- 编译插件 -->
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<!-- 插件的版本 -->
				<version>3.5.1</version>
				<!-- 编译级别 -->
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<!-- 编码格式 -->
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<!--jetty插件9.3.7:提供web应用运行的环境(tomcat) -->
			<plugin>
				<groupId>org.eclipse.jetty</groupId>
				<artifactId>jetty-maven-plugin</artifactId>
				<version>9.3.7.v20160115</version>
				<configuration>
					<!-- 扫描间隔 -->
					<scanIntervalSeconds>1</scanIntervalSeconds>
					<httpConnector>
						<!-- 端口号 -->
						<port>9090</port>
					</httpConnector>
					<webApp>
						<!-- 上下文根 -->
						<contextPath>/solrtest</contextPath>
					</webApp>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

2、首先得有个实体类,Person为例:

package com.wolfhome.solrtest.domain;

import org.apache.solr.client.solrj.beans.Field;

/**
 * Person实体类
 * 
 * <p>@ClassName:Person</p>
 * <p>Description <p>
 * <p>@Company:www.wolfhome.com</p>
 * @author Hrzhi
 * @date 2018年1月15日 上午9:02:24
 */
public class Person {

	/**
	 * person唯一标识
	 */
	@Field("id")
	private String id;
	/**
	 * person名字
	 */
	@Field("name")
	private String name;
	/**
	 * person年龄
	 */
	@Field("age")
	private Integer age;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
}

3、接下来就是打造客户端,连接solr,从solr缓存中取数据:

扫描二维码关注公众号,回复: 2894468 查看本文章

package com.wolfhome.solrtest.test;

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

import org.apache.log4j.Logger;
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.HttpSolrClient;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Before;
import org.junit.Test;

import com.wolfhome.commons.constant.util.UUIDUtils;
import com.wolfhome.solrtest.domain.Person;

/**
 * SolrService测试类
 * 
 * <p>@ClassName:SolrServiceTest</p>
 * <p>Description<p>
 * <p>@Company:www.wolfhome.com</p>
 * @author Hrzhi
 * @date 2018年1月9日 下午5:31:01
 */
public class SolrjServiceTest {

	private SolrClient solrClient;
	private Logger logger = Logger.getLogger(getClass());

	/**
	 * 初始化方法,获取solrClient对象
	 * 
	 * @throws Exception
	 */
	@Before
	public void setUp() throws Exception {
		// 在url中指定core名称:enjoyshop
		String solrUrl = "http://127.0.0.1:8983/solr/mycore";
		//Builder builder = new Builder(solrUrl);
		HttpSolrClient httpSolrClient = new HttpSolrClient.Builder(solrUrl)
				.withConnectionTimeout(5000)//设置连接超时时间
				.withSocketTimeout(5000).build(); // 定义solr的客户端

		this.solrClient = httpSolrClient;
		
		//new SolrjService(httpSolrClient);
	}
	
	/**
	 * 增加文档
	 * 
	 * @throws Exception
	 */
	@Test
    public void testAdd() throws Exception {
		//创建一个SolrInputDocument类型的集合
		Collection<SolrInputDocument> docList = new ArrayList<>();
		//此处是多条数据添加
		for (int i = 0; i < 5; i++) {
			Person person = new Person();
			person.setId(UUIDUtils.getUUIDStr());
			person.setName("王五" + (i + 1));
			person.setAge(30 + i + 1);
			
			SolrInputDocument doc = new SolrInputDocument();
			doc.addField("id", person.getId());
			doc.addField("p_name", person.getName());
			doc.addField("p_age", person.getAge());
			docList.add(doc);
		}
		solrClient.add(docList);
		
		//此处是单条数据添加
		/*Person person = new Person();
		person.setId(UUIDUtils.getUUIDStr());
		person.setName("王五");
		person.setAge(30);
		
		SolrInputDocument doc = new SolrInputDocument();
		doc.addField("id", person.getId());
		doc.addField("p_name", person.getName());
		doc.addField("p_age", person.getAge());
        solrClient.add(doc);*/
        
        //最后提交
        solrClient.commit();
        
        //添加完查询
        testQuery();
    }
	
	/**
	 * 查询文档
	 * 
	 * @throws SolrServerException
	 * @throws IOException
	 */
	@Test
	public void testQuery() throws SolrServerException, IOException{
		SolrQuery query = new SolrQuery();//创建SolrQuery对象
		query.set("q", "*:*");//设置
		query.set("start", "0");//设置起始行
		query.set("rows", "10");//设置行数
		//query.set("sort", "p_id asc");//设置排序规则
		QueryResponse response = solrClient.query(query);//创建QueryResponse对象
		//获取SolrDocument列表
		SolrDocumentList docList = response.getResults();
		logger.info("文档数据条数是:" + docList.getNumFound());
		//遍历SolrDocumentList
		for (SolrDocument document : docList) {
			logger.info("id:" + document.getFieldValue("id"));
			logger.info("p_name:" + document.getFieldValue("p_name"));
			logger.info("p_age:" + document.getFieldValue("p_age"));
			logger.info("-------------------------------------");
		}
	}

	/**
	 * 删除测试
	 * 
	 * @throws SolrServerException
	 * @throws IOException
	 */
	@Test
	public void testDelete() throws SolrServerException, IOException{
		//testDeleteById("a8495b8b-b201-4a2b-b5fe-47f81ccb6786");
		testDeleteByQuery("*:*");
		testQuery();
	}
	
	/**
	 * 删除文档BY ID
	 * 
	 * @param id
	 * @throws SolrServerException
	 * @throws IOException
	 */
	public void testDeleteById(String id) throws SolrServerException, IOException {
		UpdateResponse response = solrClient.deleteById(id);
		solrClient.commit();
		logger.info("result:" + response.getStatus() + "\t Qtime:" + response.getQTime());
	}

	/**
	 * 删除文档 BY QUERY
	 * 
	 * @throws SolrServerException
	 * @throws IOException
	 */
	public void testDeleteByQuery(String query) throws SolrServerException, IOException{
		//设置响应
		UpdateResponse response;
		//创建请求
		UpdateRequest request = new UpdateRequest();
		request.deleteByQuery(query);
		request.setCommitWithin(500);
		request.process(solrClient);
		logger.info("URL:" + request.getPath() + "\t XML:" + request.getXML() + "\t Method:" + request.getMethod());
		response = solrClient.deleteByQuery(query);
		solrClient.commit();
		logger.info("result:" + response.getStatus() + "\t Qtime:" + response.getQTime());
	}
	
	/**
	 * 测试更新文档
	 * 
	 * @throws SolrServerException
	 * @throws IOException
	 */
	@Test
	public void testUpdate() throws SolrServerException, IOException{
		testUpdateDocuments("702eee59-614c-446d-89f1-fc01787b36b2", "p_age", 94);
	}

	/**
	 * 更新文档
	 * 
	 * @param id
	 *            要更新的数据的id
	 * @param fieldName
	 *            要更新的数据的字段名称
	 * @param fieldValue
	 *            更新的字段的字段值
	 * @throws SolrServerException
	 * @throws IOException
	 */
	public void testUpdateDocuments(String id,String fieldName,Object fieldValue) throws SolrServerException, IOException{
		HashMap<String, Object> operation = new HashMap<>();
		operation.put("set", fieldValue);
		SolrInputDocument doc = new SolrInputDocument();
		doc.addField("id", id);
		doc.addField(fieldName, operation);
		UpdateResponse response = solrClient.add(doc);
		logger.info("update doc id:" + id + "\t result:" + response.getStatus() + "\t Qtime:" + response.getQTime());
		response = solrClient.commit();
		logger.info("update doc id:" + id + "\t result:" + response.getStatus() + "\t Qtime:" + response.getQTime());
		
		testQuery();
	}
}

4、至此,运行每一个方法,都可以从 solr 中读取数据,注意:是读取 solr 中的数据,而不是直接读取数据库的数据。

猜你喜欢

转载自blog.csdn.net/weixin_39082031/article/details/79077784