solr学习(六)springboot对solr索引的增删改查

solr版本:8.x

springboot版本:1.5.6

1.准备springboot项目,pom.xml需要引入以下jar包

<properties>
    <project.final.name>htsolr</project.final.name>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!--solr支持的版本-->
    <spring.data.solr.version>2.1.1.RELEASE</spring.data.solr.version>
</properties>

<!--solr支持的版本-->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-solr</artifactId>
</dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-solr</artifactId>
            <version>${spring.data.solr.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

主要引入spring-data-solr的2个支持包即可,另外再贴上整个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/xsd/maven-4.0.0.xsd">
	
	<!-- 本项目配置参数 -->
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.hornet.solr</groupId>
	<artifactId>ht-server-solr</artifactId>
	<packaging>jar</packaging>
	<name>ht-server-solr</name>
	<description>操作solr项目</description>
	
	<!-- 定义一些项目所用常量 -->
	<properties>
		<project.final.name>htsolr</project.final.name>
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<spring.data.solr.version>2.1.1.RELEASE</spring.data.solr.version>
	</properties>
	
	<!-- 引入springboot父类pom说明 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.6.RELEASE</version>
	</parent>
	
	<dependencies>
		<!-- 引入springboot支持 -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-devtools</artifactId>
		</dependency>
		
		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
		
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		
		<dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-solr</artifactId>
        </dependency>
		
	</dependencies>
	
	<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-solr</artifactId>
                <version>${spring.data.solr.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
	
	<!-- 打包 -->
	<build>
		<finalName>${project.final.name}</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
	
</project>

2.项目目录结构看下,整个demo示例项目,主要有3个地方注意,控制器class、启动class,properties配置文件

文件说明:

SolrApplication.java //启动类

SolrController.java //基于solr的增删改查的web请求方法和示例

application-dev.properties //项目相关配置,前提是application.properties里面环境应当配置为dev

另外项目中用的是logback日志插件,下面代码中如果你的环境没有用到,那把所有的log替换成syso输出即可。 

3.主要功能源码

SolrApplication.java

package com.hornet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * solr后台服务demo启动入口
 * 
 * @author avatar
 * @since 2019年4月23日 下午3:15:15
 */
@SpringBootApplication
public class SolrApplication {

	/**
	 * 程序入口
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		SpringApplication.run(SolrApplication.class);
	}

}

SolrController.java

package com.hornet.solr.web;

import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * solr增删改查demo控制器
 * 
 * @author avatar
 * @since 2019年4月23日 下午3:21:46
 */
@RestController
@RequestMapping("/solr")
public class SolrController {
	
	/** 日志记录 */
	private static final Logger log = LoggerFactory.getLogger(SolrController.class);

    @Autowired
    private SolrClient client;

    /**
     * 新增或者修改索引,当id存在时为更新,如果id不存在则为新增
     * @return
     */
    @RequestMapping("addOrUpdate")
    public String addOrUpdate() {
    	//不重复的UUID,当前现有数据从id=10开始
    	String uuid = UUID.randomUUID().toString().replaceAll("-", "");
    	try {
    		SolrInputDocument doc = new SolrInputDocument();
    		doc.setField("id", uuid);
    		doc.setField("name", "小医仙");
    		doc.setField("sex", 0);
    		doc.setField("address", "斗气大陆五大家族银城龙岛2008号");
    		doc.setField("isDeleted", 0);
    		//如果spring.data.solr.host里面配置到demo_core,那么这里就不需要传demo_core
            client.add("demo_core", doc);
            client.commit("demo_core");
            log.info("新增/更新成功!");
            return "新增/更新成功!";
        } catch (Exception e) {
            e.printStackTrace();
        }
    	return null;
    }

    /**
     * 根据id删除索引
     * 
     * @param id
     * @return
     */
    @RequestMapping("delete")
    public String delete(String id)  {
        try {
            client.deleteById("demo_core",id);
            client.commit("demo_core");
            log.info("删除id=[{}]成功!",id);
            return "删除成功!";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 删除所有的索引
     * 
     * @return
     */
    @RequestMapping("deleteAll")
    public String deleteAll(){
        try {
            client.deleteByQuery("demo_core","*:*");
            client.commit("demo_core");
            log.info("删除所有索引成功!");
            return "删除所有索引成功!";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据id查询索引
     * 
     * @return
     * @throws Exception
     */
    @RequestMapping("getById")
    public String getById(String id) throws Exception {
        SolrDocument document = client.getById("demo_core", id);
        log.info("根据id=[{}]查询索引成功!", id);
        log.info("查询结果为:{}", document.toString());
        return document.toString();
    }

    /**
     * 综合查询:可以按照条件,排序,分页,高亮显示,部分域信息查询
     * 
     * @return
     */
    @RequestMapping("search")
    public String search(String q){
        try {
            SolrQuery params = new SolrQuery();
            //查询条件,q的对应值
            params.set("q", q);
            //过滤条件,可以增加多个多虑条件
            //params.set("fq", "updateTime:[2019-04-19 08:10:59 TO 2019-04-19 09:10:59]");
            //排序,不传默认排序
            params.addSort("id", SolrQuery.ORDER.asc);
            //分页参数
            params.setStart(0);
            params.setRows(20);
            //默认域
            params.set("df", "address");
            //只查询指定域,指定显示字段
            params.set("fl", "id,name,address");
            //高亮
            //打开开关
            params.setHighlight(true);
            //指定高亮域
            params.addHighlightField("address");
            //高亮css设置前缀
            params.setHighlightSimplePre("<span style='background-color:yellow;'>");
            //高亮css设置后缀
            params.setHighlightSimplePost("</span>");
            //高亮设置每个分片的最大长度
            params.setHighlightFragsize(100000);

            QueryResponse queryResponse = client.query("demo_core", params);
            SolrDocumentList results = queryResponse.getResults();
            long numFound = results.getNumFound();
            log.info("查询结果数量为:{}条",numFound);
            log.info("查询结果为:{}",results.toString());
            
            //获取高亮显示的结果, 高亮显示的结果和查询结果是分开放的
            Map<String, Map<String, List<String>>> highlight = queryResponse.getHighlighting();
            log.info("查询结果高亮显示为:{}",highlight.toString());
//            for (SolrDocument result : results) {
//                Map<String, List<String>> map = highlight.get(result.get("id"));
//                List<String> list = map.get("address");
//                log.info(list.get(0));
//            }
            return results.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

application.properties

spring.profiles.active=dev

 application-dev.properties 

#开发环境配置文件

#开发模式
debug=false
#指定server绑定的地址
server.address=127.0.0.1
#服务启动端口
server.port=9983

#solr服务配置
spring.data.solr.host=http://127.0.0.1:8983/solr

4.springboot项目配置完成,启动项目,测试工具使用postman,下面进行测试工作

4.1.新增/更新索引

请求地址:localhost:9983/solr/addOrUpdate

  

4.2.根据id查询索引

取4.1步骤插入的id值来查询,id=a6573f43864d49dba6ff4bcef3c1d2aa

请求地址:localhost:9983/solr/getById?id=a6573f43864d49dba6ff4bcef3c1d2aa

4.3.根据id删除索引

还是这条数据的id值来进行删除,id=a6573f43864d49dba6ff4bcef3c1d2aa

请求地址:localhost:9983/solr/delete?id=a6573f43864d49dba6ff4bcef3c1d2aa

 

4.4.删除所有索引(略)

4.5.综合查询

测试之前将小医仙的数据插入solr中方便测试,先看一下solr管理平台查到的数据:

我们共查出来4条数据,下面使用postman进行测试:

请求地址:localhost:9983/solr/search?q=address:大陆

高亮显示查询到的结果数据:

先看一下solr管理平台查到的高亮显示的数据:

高亮显示其实就是在查询出来的字段前后加上CSS高亮的代码,具体高亮的样式自由控制。

下面我们用postman测试,看代码中如何获取到高亮的数据:

localhost:9983/solr/search?q=address:大陆 

还是发起这个请求,然后看下代码逻辑,这里会成功输出对应高亮数据:

到这里,springboot集成solr进行增删改查的常规测试操作就完成了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cgv3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值