Java使用SolrJ

SolrJ是访问Solr服务器的Java客户端。

注:Solrj和图形界面操作的区别就类似于操作数据库时,使用jdbc和mysql客户端(如:navicat)的区别一样。

声明:此示例的软硬件环境为:Windows、Eclipse、JDK1.8、Solr7.3.0

提示:这里主要给出普通项目使用SolrJ的示例,在本文最后,会给出SpringBoot要使用SolrJ的话,需要哪些微调整。

开发准备:给JAVA项目导入所需要的jar包

找到解压后文件夹下的dist目录,复制solr-solrj的jar包至Java项目中

Java使用SolrJ_第1张图片

找到解压后文件夹下的dist/solrj-lib目录,复制其内所有的jar包至Java项目中

Java使用SolrJ_第2张图片

注:这里是有slf4j-api接口的jar包,并没有给我们提供日志框架的实现,所以我们还需要选择日志框架的实现,导入Java项目中(本人选择logback作为日志框架的实现)

此时,Java项目中的jar包应有:

Java使用SolrJ_第3张图片

Java使用SolrJ查询

/**
 * Solr---查询
 *
 * @date 2018年8月9日 上午9:48:14
 */
public void solrQuery() {

	// 指定要连接的SolrCore
	String solrUrl = "http://127.0.0.1:8983/solr/solr_core";

	// 创建Solr客户端(注:与HttpClient类似)
	HttpSolrClient httpSolrClient = new HttpSolrClient.Builder(solrUrl)
                                            .withConnectionTimeout(60000)
                                            .withSocketTimeout(20000)
                                            .build();
	// 创建SolrQuery对象
	SolrQuery query = new SolrQuery();

	/*
	 * 输入查询条件 注:且用“AND”, 或用“OR”;这里不能能进行多复杂的筛选,如果想进一步筛选可配置下面的过滤
	 */
	query.setQuery("product_name:别致  OR product_name:欧式");

	/// 或查询时不指定域,但是给其配置默认域
	// query.setQuery("笔记本");
	// query.set("df", "product_name");

	// 或这样
	// query.set("q", "product_name:笔记本");

	// 设置过滤条件
	query.setFilterQueries("product_price:[1 TO 80]");
	/// 再给出几个示例
	// query.setFilterQueries("id:2009");
	// query.setFilterQueries("product_price:[1 TO 100] AND id:[2000 TO 2009]");
	// query.setFilterQueries("product_price:[1 TO 10] OR product_price:[30 TO 40]");


	// 排序设置(这里按价格降序)
	query.setSort("product_price", ORDER.desc);
	// 设置次级排序(这里即:当product_price一样时,按id升序排列),如果还要再设置次级的话,那么再进行此步骤即可
	 query.addSort("id", ORDER.asc);

	// 设置分页信息(默认为:0,10)
	query.setStart(0);
	query.setRows(100);

	// 设置查询的Field(即:设置要查询的列)
	query.setFields("id", "product_name", "product_price", "product_picture");

	// 设置对应域中,对应的“查询条件”字段高亮显示
	query.setHighlight(true);
	query.addHighlightField("product_name");
	query.setHighlightSimplePre("[>>>");
	query.setHighlightSimplePost("<<<<]");

	try {
		// 执行查询并返回结果
		QueryResponse response = httpSolrClient.query(query);
		System.out.println(">>>>>>>>>>" + httpSolrClient.query(query).getHeader());

		// 从响应中获取到查询结果文档
		SolrDocumentList solrDocumentList = response.getResults();

		// 匹配结果总数
		long count = solrDocumentList.getNumFound();
		System.out.println("匹配结果总数:" + count);

		// 遍历查询结果
		// 获取高亮显示信息
		Map>> highlighting = response.getHighlighting();
		for (SolrDocument doc : solrDocumentList) {
			System.out.println("id:" + doc.get("id"));
			System.out.println("商品名:" + doc.get("product_name"));
			// 处理高亮显示的结果
			List list2 = highlighting.get(doc.get("id")).get("product_name");
			if (list2 != null) {
				System.out.println("商品名称中满足查询条件,再次(高亮)显示商品名:" + list2.get(0));
			}
			System.out.println("价格:" + doc.get("product_price"));
			System.out.println("图片:" + doc.get("product_picture"));
			System.out.println("------------------华丽分割线------------------");
		}
	} catch (SolrServerException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}finally {
		try {
			// 关闭客户端,释放资源
			httpSolrClient.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

给出调用此方法后consoles输出结果截图(部分):

Java使用SolrJ_第4张图片

Java使用SolrJ增加、修改

/**
 * Solr---新增/修改(有该id则修改,无该id则新增)
 *
 * @date 2018年8月9日 下午9:12:57
 */
public void solrAddOrUpdate() {

	// 指定要连接的SolrCore
	String solrUrl = "http://127.0.0.1:8983/solr/solr_core";

	// 创建Solr客户端(注:与HttpClient类似)
	HttpSolrClient httpSolrClient = new HttpSolrClient.Builder(solrUrl)
                                            .withConnectionTimeout(60000)
                                            .withSocketTimeout(20000)
                                            .build();

	// 创建文档doc
	SolrInputDocument document = new SolrInputDocument();

	/*
	 * 添加内容 注:参数分别是:(域名,对应的值) 注:域的名称必须是在schema.xml中定义的 注:id域一定要有
	 */
	document.addField("id", "12345");
	document.addField("name", "邓沙利文");
	document.addField("title", "测试solrAddOrUpdate");

	try {
		// 执行add并返回结果
		UpdateResponse updateResponse = httpSolrClient.add(document);
		System.out.println("方法操作耗时(毫秒)......" + updateResponse.getElapsedTime());
		// 这里必须要commit提交
		httpSolrClient.commit();
	} catch (SolrServerException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			// 关闭客户端,释放资源
			httpSolrClient.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

我们先查一下有没有id为12345的索引(使用Solr图形界面更直观):

Java使用SolrJ_第5张图片

此时,没有id为12345的索引。

 

我们调用运行上述方法后,再查一下:

Java使用SolrJ_第6张图片

此时,有id为12345的索引了,说明新增索引成功!

 

我们将方法中的name域的值改为“JustryDeng”,再调用运行一下该方法后,再查一下:

Java使用SolrJ_第7张图片

此时,查出来的结果变了,说明修改索引成功!

Java使用SolrJ删除

/**
 * Solr---删除
 *
 * @date 2018年8月9日 下午9:36:05
 */
public void solrDelete() {

	// 指定要连接的SolrCore
	String solrUrl = "http://127.0.0.1:8983/solr/solr_core";

	// 创建Solr客户端(注:与HttpClient类似)
	HttpSolrClient httpSolrClient = new HttpSolrClient.Builder(solrUrl)
                                            .withConnectionTimeout(60000)
                                            .withSocketTimeout(20000)
                                            .build();

	try {
		// 执行删除
		httpSolrClient.deleteByQuery("id:12345");
		// 再给出两种常用的删除方式
		// httpSolrClient.deleteById(String id)
		// httpSolrClient.deleteById(List ids)
		
		// 这里必须要commit提交
		httpSolrClient.commit();
	} catch (SolrServerException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			// 关闭客户端,释放资源
			httpSolrClient.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

调用运行上述删除方法前,我们先查一下id为12345的索引是否存在:

Java使用SolrJ_第8张图片

如上图,id为12345的索引是存在的。

 

运行上述方法,再查询id为12345的索引是否存在:

Java使用SolrJ_第9张图片

由此可见,删除索引成功。

SpringBoot使用SolrJ

注意事项

1.按照第三节或第二节搭建好Solr

2.在pom.xml中引入相关依赖



	org.springframework.data
	spring-data-solr



	org.springframework.data
	spring-data-solr

注:SpringBoot中默认集成了logback、solr等,所以我们只需要在这里引入依赖(不需要指定版本,因为其内部已经默认了要使用哪一个版本)即可。

3.按照上文普通Java项目使用SolrJ的方式使用SolrJ即可。

但是注意一点:高版本的Solr才支持此创建Solr客户端的方式:

Java使用SolrJ_第10张图片

如果是低版本的Solr,需要这么创建Solr客户端:

参考链接

  • https://blog.csdn.net/zcl_love_wx/article/details/52092098

  • https://www.cnblogs.com/arli/p/6837931.html

  • https://www.cnblogs.com/gaogaoyanjiu/p/7815558.html

  • 讲武堂视频文档资料

示例项目托管在

  • https://github.com/JustryDeng/PublicRepository

如有不当之处,欢迎指正

本文已经被收录进《程序员成长笔记(二)》,笔者JustryDeng

你可能感兴趣的:(Java知识大杂烩)