`
newspringwork
  • 浏览: 101671 次
  • 性别: 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);
	}
}
 
分享到:
评论

相关推荐

    solr同步数据库需要jar包

    Solr,全称为Apache Solr,是一款开源的企业级搜索平台,基于Java开发,广泛应用于全文检索、企业级内容管理和网站搜索。在Solr中,为了实现与数据库的实时同步,通常会采用增量索引策略,确保数据库中的新数据或...

    java开源包101

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

    solr教材-PDF版

    - **1.4.3 solr的各包的说明**:Solr的各个包按照功能模块划分,如org.apache.solr.client包包含了客户端相关的类,org.apache.solr.update包则负责索引更新等功能。 **1.5 版本说明** - **1.5.1 1.3版本**:介绍...

    Solr3.5开发应用指导

    2. **调用第三方搜索引擎如Google、Baidu的API实现站内搜索**:这种方式简单快捷,但存在依赖外部服务的风险,并且对于高度定制化的需求支持不足。 3. **基于Compass+Lucene实现站内搜索**:适合于数据库驱动的应用...

    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开源包4

    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开源包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 设计原则 容易维护扩展(不...

    solr从入门到精通教程

    - 搜索接口的调用实例:实际演示如何调用Solr的搜索接口。 - Solrj的使用说明:介绍了如何使用SolrJ添加数据、直接添加POJO到Solr和从Solr读取数据。 - 创建查询:说明了如何创建查询并使用SolrJ进行索引的创建。 5...

    java开源包3

    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 设计原则 容易维护扩展(不...

    java开源包2

    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开源包7

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

    开源企业搜索引擎SOLR的应用教程

    2. **调用第三方搜索引擎API**(如Google、Baidu):这种方式虽然简便快捷,但由于与第三方平台绑定紧密,不利于长期业务发展和功能扩展,因此仅作为临时方案。 3. **基于Compass+Lucene实现站内搜索**:适用于需要...

Global site tag (gtag.js) - Google Analytics