zoukankan      html  css  js  c++  java
  • 使用代码实现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

  • 相关阅读:
    找工过程中碰到的笔试面试题整理(1)
    windows核心编程学习笔记(五.续)堆
    windows核心编程学习笔记(二)Wait For Kernel Object(s)
    windows核心编程学习笔记(四)windows内存结构/虚拟内存/线程的堆栈
    [转]筛选法求素数
    windows核心编程学习笔记(五)内存映射文件
    windows核心编程学习笔记(八)结构化异常处理(Structured Exception Handling)
    [转]亲密接触VC6.0编译器
    windows核心编程学习笔记(三)线程池(Thread Pooling)
    windows核心编程学习笔记(七)DLL Injection and API Hooking
  • 原文地址:https://www.cnblogs.com/david1216/p/11482228.html
Copyright © 2011-2022 走看看