Spring Boot 中使用 Solr

个人学习SpringBoot系列 Solr篇

Github Link: https://github.com/panjianlong13/SpringBoot-SpringCloud/tree/master/spring-boot-solr-base


Solr介绍

Solr 是什么

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。Solr部署方式有单机方式、多机Master-Slaver方式、Cloud方式。SolrCloud是基于Solr和Zookeeper的分布式搜索方案。当索引越来越大,一个单一的系统无法满足磁盘需求,查询速度缓慢,此时就需要分布式索引。在分布式索引中,原来的大索引,将会分成多个小索引,solr可以将这些小索引返回的结果合并,然后返回给客户端。

为什么要使用solr:

1、solr是将整个索引操作功能封装好了的搜索引擎系统(企业级搜索引擎产品)

2、solr可以部署到单独的服务器上(WEB服务),它可以提供服务,我们的业务系统就只要发送请求,接收响应即可,降低了业务系统的负载

3、solr部署在专门的服务器上,它的索引库就不会受业务系统服务器存储空间的限制

4、solr支持分布式集群,索引服务的容量和能力可以线性扩展

Solr 工作方式

文档通过Http利用XML 加到一个搜索集合中。查询该集合也是通过http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。


Solr环境搭建(Mac)

## 安装Solr
brew install solr

## 安装成功之后启动
solr start

solr 的默认端口是8983,我们在浏览器中输入 http://localhost:8983/solr/

新建SpringBoot项目 

在pom.xml中添加依赖

SolrController

package com.peter.springboot.solr.controller;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@RestController
@RequestMapping("/test")
@EnableSwagger2
public class SolrController {

	@Autowired
	private SolrClient client;

	/**
	 * 1、增
	 * 
	 * @param message
	 * @return
	 * @throws IOException
	 * @throws SolrServerException
	 */
	@PostMapping("/insert")
	public String insert(String message) throws IOException, SolrServerException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
		String dateString = sdf.format(new Date());
		try {
			SolrInputDocument doc = new SolrInputDocument();
			doc.setField("id", dateString);
			doc.setField("text", message);

			/*
			 * 如果 spring.data.solr.host 里面配置到 core了, 那么这里就不需要传 collection1 这个参数 下面都是一样的 即
			 * client.commit();
			 */

			client.add("test", doc);
			client.commit("test");
			return dateString;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "error";
	}

	/**
	 * 2、查 id
	 * 
	 * @param id
	 * @return
	 * @throws SolrServerException
	 * @throws IOException
	 */
	@GetMapping("/get/{id}")
	public String getDocumentById(@PathVariable String id) throws SolrServerException, IOException {
		SolrDocument document = client.getById("test", id);
		System.out.println(document);
		return document.toString();

	}

	/**
	 * 3、删 id
	 * 
	 * @return
	 */
	@DeleteMapping("/delete/{id}")
	public String getAllDocuments(@PathVariable String id) {
		try {
			client.deleteById("itaem", id);
			client.commit("itaem");
			return id;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "error";
	}

	/**
	 * 4、删 all
	 * 
	 * @return
	 */
	@DeleteMapping("deleteAll")
	public String deleteAll() {
		try {

			client.deleteByQuery("itaem", "*:*");
			client.commit("itaem");
			return "success";
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "error";
	}

	/**
	 * 5、改
	 * 
	 * @param message
	 * @return
	 * @throws IOException
	 * @throws SolrServerException
	 */
	@PutMapping("/update")
	public String update(String id, String message) throws IOException, SolrServerException {
		try {
			SolrInputDocument doc = new SolrInputDocument();
			doc.setField("id", id);
			doc.setField("text", message);

			/*
			 * 如果 spring.data.solr.host 里面配置到 core了, 那么这里就不需要传 itaem 这个参数 下面都是一样的 即
			 * client.commit();
			 */
			client.add("itaem", doc);
			client.commit("itaem");
			return doc.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "error";
	}

	/**
	 * 6、全
	 * 
	 * @return
	 * @throws SolrServerException
	 * @throws IOException
	 */
	@GetMapping("/get/all")
	public Map<String, Object> getAll() throws SolrServerException, IOException {
		Map<String, Object> map = new HashMap<String, Object>();
		return map;
	}

	/**
	 * 7、查 ++:关键字、高亮、分页 ✔
	 * 
	 * @return
	 * @return
	 * @throws SolrServerException
	 * @throws IOException
	 */
	@GetMapping("/select/{q}/{page}/{size}")
	public Map<String, Object> select(@PathVariable String q, @PathVariable Integer page, @PathVariable Integer size)
			throws SolrServerException, IOException {
		SolrQuery params = new SolrQuery();

		// 查询条件
		params.set("q", q);

		// 排序
		params.addSort("id", SolrQuery.ORDER.desc);
		// 分页
		params.setStart(page);
		params.setRows(size);

		// 默认域
		params.set("df", "text");

		// 只查询指定域
		params.set("fl", "id,text");

		// 开启高亮
		params.setHighlight(true);
		// 设置前缀
		params.setHighlightSimplePre("<span style='color:red'>");
		// 设置后缀
		params.setHighlightSimplePost("</span>");

		// solr数据库是 itaem
		QueryResponse queryResponse = client.query("itaem", params);
		SolrDocumentList results = queryResponse.getResults();

		// 数量,分页用
		long total = results.getNumFound();// JS 使用 size=MXA 和 data.length 即可知道长度了(但不合理)

		// 获取高亮显示的结果, 高亮显示的结果和查询结果是分开放的
		Map<String, Map<String, List<String>>> highlight = queryResponse.getHighlighting();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("total", total);
		map.put("data", highlight);
		return map;

	}

}

参数配置

插入数据

查询到插入的数据

猜你喜欢

转载自blog.csdn.net/panjianlongWUHAN/article/details/84875496