Solr在JAVA项目中的详细配置

1. 项目架构

zookper + dubbo+springboot
在这里插入图片描述

  • API提供接口
    在这里插入图片描述

  • service属于生产者,业务逻辑实现
    在这里插入图片描述

  • web属于消费者
    在这里插入图片描述

2. 开发核心jar
  • redis和solr启动客户端的jar包
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-solr</artifactId>
		</dependency>
3. 将solr 组件托管到IOC
  • 在生产者中托管SolrConfig.java
package com.itany.conf;

import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SolrConfig {

    @Bean(name = "solrClient")
    public HttpSolrClient solrClient(){
         return new HttpSolrClient.Builder("http://localhost:8080/solr/t_user")//服务访问地址+redis库名字
                    .withConnectionTimeout(10000)//设置与服务端的连接超时时间
                    .withSocketTimeout(10000)    //设置连接操作时间的超时时间
                    .build();
    }

}
4. solr添加方法和查询所有数据方法实现类
  • 在生产者中新建实现类BookServiceImpl实现API中的接口
package com.itany.book.service.impl;

import com.itany.book.service.IBookService;
import com.itany.pojo.User;
import org.apache.solr.client.solrj.SolrQuery;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by tyh on 2018/9/23.
 */
@Service
@com.alibaba.dubbo.config.annotation.Service
public class BookServiceImpl implements IBookService{

    @Autowired
    private HttpSolrClient httpSolrClient;//通过该对象和solr服务交互

    /**
     * 添加方法
     * 通过循环来向solr中t_user库添加一组数据
     */
    @Override
    public void addDoc() {
          //此处查询mysql并且书籍数据插入solr作为初始化数据
          try {
              for(int i=0;i<10;i++){
                  //CIUD操作操作SolrInputDocument对象
                  SolrInputDocument doc = new SolrInputDocument();
                  doc.addField("id",i);
                  doc.addField("username","用户"+i);
                  httpSolrClient.add(doc);
              }
              httpSolrClient.commit();

              /*httpSolrClient.deleteByQuery("*:*");*/

          }catch (Exception e){
             try {
                 httpSolrClient.rollback();
             }catch (Exception e1){

             }
          }

    }

    @Override
    public List<Map<String, String>> findDoc() {
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        try {

            String q = "username:用户";
            SolrQuery solrQuery = new SolrQuery();
            solrQuery.setQuery(q);
            //分页查询
           /* solrQuery.setStart((pageNo-1)*pageSize);
            solrQuery.setRows(pageSize);*/
            solrQuery.setHighlight(true);
            //设置高亮头
            solrQuery.setHighlightSimplePre("<font color='red'>");
            //设置高亮尾部
            solrQuery.setHighlightSimplePost("</font>");
            //设置查询的高亮数据
            solrQuery.setParam("hl.fl","username");
            //http请求返回的数据是用QueryResponse接受
            QueryResponse response = httpSolrClient.query(solrQuery);
            //类似数据库的结果集,但是这个redis中数据类型
            SolrDocumentList result = response.getResults();
            //获取总数据条数
            System.out.println(result.getNumFound());

            for(int i=0;i<result.size();i++){
                Map<String, String> vo = new HashMap<String, String>();
                SolrDocument doc = result.get(i);//这个数据是没有高亮的
                String id = (String)doc.get("id");
                //list取出的值是没有高亮的需要,二次获取设置高亮
                Map<String,List<String>> map = response.getHighlighting().get(id);
                List<String> userList = map.get("username");
                if(userList!=null){
                    vo.put("username",userList.get(0));
                }else{
                    //如果为空放入原始的值
                    vo.put("username",(String)doc.get("username"));
                }
                list.add(vo);

            }


        }catch (Exception e){
            e.printStackTrace();
        }

        return list;
    }

    @Override
    public void deleteDoc() {
        try {
            //根据查询删除数据
            httpSolrClient.deleteByQuery("*:*");

            httpSolrClient.commit();
        }catch (Exception e){
            try {
                httpSolrClient.rollback();
            }catch (Exception e1){

            }
        }
    }


}

在这里插入图片描述

  • 在response中的高亮数据储存的位置,所以list中没有高亮的,需要二次重写
5. 消费者中配置contoller
package com.itany.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.itany.book.service.IBookService;
import com.itany.vo.ActionResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

/**
 * Created by tyh on 2018/9/23.
 */
@RestController
@RequestMapping("/testbook")
public class TestBookController {
   //远程注入
    @Reference
    private IBookService bookService;

    @RequestMapping("/addDoc")
    public ActionResult addDoc(){
        ActionResult ac = new ActionResult();
        bookService.addDoc();
        ac.setStatus(0);
        return ac;
    }


    @RequestMapping("/findDoc")
    public List<Map<String,String>> findDoc(){
           return bookService.findDoc();
    }

}

  • 访问界面

在这里插入图片描述

  • 在solr中t_user库中数据
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值