`
newspringwork
  • 浏览: 99153 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

第六章. Java调用Solr

    博客分类:
  • Solr
 
阅读更多

1. 引入相关Jar包

<dependency>
	<groupId>org.apache.solr</groupId>
	<artifactId>solr-solrj</artifactId>
	<version>6.5.0</version>
</dependency>
<!-- 测试代码用到,不需要可不加 -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.12</version>
</dependency>

2.调用Solr搜索数据

    * Solr测试类SolrTest.java

 

public class SolrTest {
	private static Logger log = LogManager.getLogger();

	public static void main(String[] args) throws Exception {
		String solrUrl = "http://localhost:10001/solr/core_test";
		HttpSolrClient client = new HttpSolrClient.Builder(solrUrl).build();
		SolrQuery query = new SolrQuery();
		query.set("wt", "json");
		// 查询字符串,查询名称中有James/Curry,并且年龄为20~30(包含)的记录
		query.set("q", "name:(James Curry) AND age:[20 TO 30]");
		// 返回的记录包含哪些字段,多个用逗号空格分割
		query.set("fl", "id,name,age");
		query.set("sort", "age ASC,name DESC");
		// 过滤查询:年龄范围25~30
		// query.set("fq", "age:[25 TO 30]");

		// ***********高亮 setting start***********
		// 开启高亮
		query.set("hl", "true");
		// 高亮字段
		query.set("hl.fl", "name");
		// 高亮格式(前)
		query.set("hl.simple.pre", "<span>");
		// 高亮格式(后)
		query.set("hl.simple.post", "</span>");
		// ***********高亮 setting end***********

		// 分页,返回数据由第几条记录开始
		query.setStart(0);
		// 分页,返回记录的条数
		query.setRows(10);
		//
		QueryResponse response = client.query(query);
		SolrDocumentList result = response.getResults();
		//
		List<Star> starList = response.getBeans(Star.class);
		log.info("total:{},start:{},end:{}",result.getNumFound(),result.getStart(),result.getStart()+result.size());
		log.info("----------列表数据----------");
		for (Star star : starList) {
			log.info(JSONObject.toJSONString(star));
		}
		log.info("----------高亮----------");
		Map<String, Map<String, List<String>>> hlMap = response.getHighlighting();
		Iterator<Entry<String, Map<String, List<String>>>> hlIterator = hlMap.entrySet().iterator();
		while(hlIterator.hasNext()){
			Entry<String, Map<String, List<String>>> hlItem = hlIterator.next();
			log.info("id->{},highlight->{}",hlItem.getKey(),hlItem.getValue());
		}
	}
}
  
    * Solr搜索记录对应实体类Star.java
import org.apache.solr.client.solrj.beans.Field;

public class Star {
	@Field("id")
	private String id;
	@Field("name")
	private String name;
	@Field("age")
	private int 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 int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}
 搜索结果:
2017-04-21 17:17:37.765 [main] INFO  - total:2,start:0,end:2
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.766 [main] INFO  - ----------列表数据----------
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.820 [main] INFO  - {"age":27,"id":"66654e81-c1a9-4961-b782-5513f0928f2a","name":"James Harden"}
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.820 [main] INFO  - {"age":28,"id":"18f483cc-afda-4cc5-926e-5035bc427239","name":"Curry"}
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.820 [main] INFO  - ----------高亮----------
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.820 [main] INFO  - id->66654e81-c1a9-4961-b782-5513f0928f2a,highlight->{name=[<span>James</span> Harden]}
cn.tinyf.demo.solr.SolrTest
2017-04-21 17:17:37.821 [main] INFO  - id->18f483cc-afda-4cc5-926e-5035bc427239,highlight->{name=[<span>Curry</span>]}
cn.tinyf.demo.solr.SolrTest
 
3.添加&更新文档(记录)
更新主要方法有(反括号表示有带此参数的重载方法):
  • addBean(Object [,int])
  • add(SolrInputDocument [,int])
测试代码:
import org.apache.solr.client.solrj.impl.HttpSolrClient;

import cn.tinyf.demo.Utils;

public class SolrUpdateTest {
	private static Scanner reader;

	public static void main(String[] args) throws Exception {
		String solrUrl = "http://localhost:10001/solr/core_test";
		HttpSolrClient solrClient = null;
		try {
			// 构造输入
			reader = new Scanner(System.in);
			// 新建solr客户端
			solrClient = new HttpSolrClient.Builder(solrUrl).build();

			int menu = 0;
			String line = null;
			Star data;
			while ((menu = selectMenu()) != 0) {
				switch (menu) {
				// 增加文档
				case 1:
					System.out.println(">>>增加记录<<<");
					System.out.print("请输入name:");
					line = reader.nextLine();
					if (Utils.isEmpty(line)) {
						break;
					}
					data = new Star();
					data.setName(line);
					System.out.print("请输入age:");
					line = reader.nextLine();
					if (Utils.isEmpty(line) || !line.trim().matches("\\d*")) {
						break;
					}
					data.setAge(Integer.parseInt(line));
					data.setId(Utils.uuid());
					solrClient.addBean(data, 100);
					System.out.println(">>>To do add next,id->" + line);
					break;
				// 修改
				case 2:
					System.out.println(">>>修改记录<<<");
					System.out.print("请输入记录ID:");
					line = reader.nextLine();
					if (Utils.isNotEmpty(line)) {
						solrClient.deleteById(line);
					}
					data = new Star();
					data.setId(line);
					System.out.print("请输入name:");
					line = reader.nextLine();
					if (Utils.isEmpty(line)) {
						break;
					}
					data.setName(line);
					System.out.print("请输入age:");
					line = reader.nextLine();
					if (Utils.isEmpty(line) || !line.trim().matches("\\d*")) {
						break;
					}
					data.setAge(Integer.parseInt(line));
					solrClient.addBean(data, 100);
					System.out.println(">>>To do update next,id->" + line);
					break;
				// 刪除
				case 3:
					System.out.println(">>>删除记录<<<");
					System.out.print("请输入记录ID:");
					line = reader.nextLine();
					if (Utils.isNotEmpty(line)) {
						solrClient.deleteById(line);
					}
					System.out.println(">>>To do delete next,id->" + line);
					break;
				// 马上提交更改
				case 4:
					System.out.println(">>>Commit right now!");
					solrClient.commit();
					break;
				default:
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			reader.close();
			if (solrClient != null) {
				solrClient.commit();
			}
		}
	}

	private static int selectMenu() {
		do {
			System.out.println("******Solr Menu******");
			System.out.println("*1.增加记录");
			System.out.println("*2.更新记录");
			System.out.println("*3.删除记录");
			System.out.println("*4.提交更改");
			System.out.println("*0.退出");
			System.out.print("*********************\n请选择:");
			String line = reader.nextLine();
			if (line.matches("\\s*[0-4]\\s*")) {
				return Integer.parseInt(line);
			} else {
				System.out.println(">>>选择错误(" + line + "),请重新选择<<<");
			}
		} while (true);
	}
}
 
分享到:
评论

相关推荐

    java开源包101

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包1

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包10

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包6

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    JAVA上百实例源码以及开源项目源代码

    第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动...

    java开源包4

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包11

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包9

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    JAVA上百实例源码以及开源项目

    第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动...

    java开源包8

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包5

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包3

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包2

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包7

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    Java资源包01

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 淘淘商城第六天笔记.doc │ ├─07.第七天 │ 01.第六天内容复习.avi │ 02.课程计划.avi │ 03.redis单机版安装.avi │ 04.redis集群安装.avi │ 05.jedis客户端.avi │ 06.jedis客户端在spring中的配置.avi │...

    t淘淘商城项目 商城项目 视频和源码教程 详细

    第一天 讲师:传智.入云龙 1. 聊聊电商行业 1.1. 电商行业发展  近年来,中国的电子商务快速发展,交易额连创新高,电子商务在各领域的应用不断拓展和深化、相关服务业蓬勃发展、支撑体系不断健全完善、...

    大型分布式网站架构与实践

    第1章 面向服务的体系架构(SOA) 1  本章主要介绍和解决以下问题,这些也是全书的基础:  HTTP协议的工作方式与HTTP网络协议栈的结构。  如何实现基于HTTP协议和TCP协议的RPC调用,它们之间有何差别,分别适应...

Global site tag (gtag.js) - Google Analytics