使用代码实现Solr数据操作

一、前言

Solr的操作方式主要有三种:

1、使用Solrj进行操作,适合JavaSE程序开发

2、使用spring-data-solr进行操作,适合SSM程序开发

3、使用springboot插件spring-boot-starter-data-solr进行操作,适合springboot程序开发

二、使用Solrj开发代码

1、引入Maven支持

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>8.2.0</version>
</dependency>

2、编写对Solr进行增删改查的代码。示例如下:

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
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 java.io.IOException;

/**
 * Created by David on 2019/9/6.
 */
public class TestSolr {

    private static final String solrUrl = "http://localhost:8983/solr/articles";

    //添加信息&修改信息
    public void addSolr() throws SolrServerException, IOException {
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        SolrInputDocument document = new SolrInputDocument();
        // 注意:id的域不能少
        document.addField("id", "10");
        document.addField("title", "基于java的面向对象编程");
        solrClient.add(document);
        solrClient.commit();
    }

    //删除信息
    public void delSolr() throws IOException, SolrServerException {
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        solrClient.deleteById("10");//删除
        solrClient.commit();//提交
    }

    //查询信息
    public void searchSolr() throws IOException, SolrServerException {
        HttpSolrClient solrClient = new HttpSolrClient.Builder(solrUrl)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000)
                .build();
        SolrQuery query = new SolrQuery();
        query.set("q", "name:编程");
        // 调用server的查询方法,查询索引库
        QueryResponse response = solrClient.query(query);
        // 查询结果
        SolrDocumentList results = response.getResults();
        // 查询结果总数
        long cnt = results.getNumFound();
        System.out.println("查询结果总数:" + cnt);
        for (SolrDocument solrDocument : results) {
            System.out.println(solrDocument.get("id"));
            System.out.println(solrDocument.get("title"));
        }
    }
}

三、使用spring-data-solr开发代码

1、引入Maven支持,不同版本的spring-data-solr操作代码不一致,此文用最新的4.0版本。

注意:spring-data-solr-4.0版本对应的spring版本为5.1.9,springMVC的版本要与之相同,否则会报错误。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-solr</artifactId>
    <version>4.0.10.RELEASE</version>
</dependency>

2、编写POJO,其中@Id为主键标识,@Indexed为Solr中Field填充项标识。早期的spring-data-solrs和solrj使用的注解为:@Field

@SolrDocument(solrCoreName = "articles")
public class Articles implements Serializable {
    @Id
    @Indexed
    private int id;
    @Indexed
    private String title;
    private String content;
    @Indexed
    private Date createDate;
}

3、编写spring配置文件spring-solr.xml,注意地址只引用到http://localhost:8983/solr,因为项目中可能需要多个Collection。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- solr服务器地址 -->
    <bean id="solrClientFactory" class="org.springframework.data.solr.server.support.HttpSolrClientFactoryBean">
        <property name="url" value="http://localhost:8983/solr"/>
        <property name="timeout" value="5000"/>
        <property name="maxConnections" value="100"/>
    </bean>
    <!-- solr模板 -->
    <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
        <constructor-arg index="0" ref="solrClientFactory"/>
    </bean>
</beans>

4、controller代码,注意操作的时候需要指定Collection。

import org.apache.solr.client.solrj.response.UpdateResponse;
import org.lanqiao.entity.Articles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.Query;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;
import java.util.List;
import java.util.Optional;


/**
 * Created by David on 2019/9/7.
 */
@Controller
public class ArticlesController {
    @Autowired
    private SolrTemplate solrTemplate;

    @RequestMapping("/save")
    @ResponseBody
    public String save() {
        Articles articles = new Articles();
        articles.setId(11);
        articles.setTitle("山东济南商城");
        articles.setCreateDate(new Date());
        solrTemplate.saveBean("articles",articles);
        solrTemplate.commit("articles");
        return "success save !";
    }

    @RequestMapping("/get")
    @ResponseBody
    public Articles selectById() {
        Optional<Articles> optional = solrTemplate.getById("articles", 1, Articles.class);
        return optional.get();//optional jdk1.8+ 解决空指针问题。
    }

    @RequestMapping("/del")
    @ResponseBody
    public int delById() {
        UpdateResponse updateResponse = solrTemplate.deleteByIds("articles","11");
        return updateResponse.getStatus();//0 表示成功
    }

    @RequestMapping("/select")
    @ResponseBody
    public List<Articles> select() {
        // 查询所有
        Query query = new SimpleQuery();
        
        // 设置条件
        Criteria criteria = new Criteria("title").is("吉林");
        query.addCriteria(criteria);
        
        //设置分页
        query.setOffset(0l); //开始索引(默认0)
        query.setRows(2);  //每页记录数(默认10)

        //设置排序规则
        Sort sort = new Sort(Sort.Direction.ASC, "createDate");
        query.addSort(sort);
        
        //查询
        ScoredPage<Articles> pages = solrTemplate.queryForPage("articles", query, Articles.class);
        System.out.println("pages.getTotalElements() = " + pages.getTotalElements());
        List<Articles> content = pages.getContent();
        return content;
    }
    
}

SpringMVC部分的知识点此处就不详细描述,程序清单如下:

三、springboot插件开发

Springboot插件默认是使用SolrjSolrClient对象实现Solr操作。参见博客:https://www.jianshu.com/p/05a161add1a6

笔者认为spring-data-solr SolrTemplate 更适合进行开发,所以此处重点讲如何将默认的Solrj改成spring-data-solr。

1、引入Maven支持

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>

引入后可以看到其即支持Solrj同时也支持spring-data-solr实现Solr的操作。

2、配置application.properties文件,使用spring-data-solr-4.0版本只配置到根路径。

# solr配置
spring.data.solr.host=http://localhost:8983/solr

3、编写config文件,将Solrj的SolrClinet封装为spring-data-solr的SolrTemplate。

import org.apache.solr.client.solrj.SolrClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.solr.core.SolrTemplate;

@Configuration
public class MySolrConfig {
    @Autowired
    SolrClient solrClient;

    @Bean
    public SolrTemplate getSolrTemplate() {
        return new SolrTemplate(solrClient);
    }

}

这样就可以使用SolrTemplate对象来操作Solr了,controller中的方法和entity中的对象都不用改变,同上面的代码。

程序清单:

 POJO代码:

controller代码:

 

参考文章:

https://blog.csdn.net/likemebee/article/details/78469002

https://www.jianshu.com/p/05a161add1a6

https://blog.csdn.net/zhuzg2005/article/details/89598925

原文地址:https://www.cnblogs.com/david1216/p/11482228.html