SSM+(solr+tomcat)

流程

  1. tomcat+solr
  2. SSM
  3. SSM+(tomcat+solr)

工具版本

  1. tomcat:7.0.56
  2. solr:4.10.3

1.SSM+tomcat

  1. 解压一个干净的tomcat

  2. 修改tomcat中conf包下的tomcat-users.xml文件(tomcat有关用户的配置)

    • 在文件的中添加一下代码(文件尾部有类型内容,被注释掉了)
     
      
      
      
      
    
  3. 启动tomcat,输入用户名和密码进入管理界面,tomcat就完成了有关用户的配置

截图1.png
  • 进入一下界面,就说明用户配置完成
截图2.png
  1. 将solr-dist-solr.war复制到tomcat-webapps下

  2. 重新启动tomcat

  3. 将solr-example-lib-ext下的所有包拷贝到tomcat-webapps-solr-WEB-INF-lib中

  4. 将solr-example-resource-log4j.properties复制到tomcat-webapps-solr-WEB-INF-classes下(classes是新建的,名字必须是这个名字)

  5. 新建solr_home文件夹,并将solr-example-solr-collection1(是整个文件下,不是文件夹下的内容)复制到solr_home下

  6. 修改tomcat-webapps-solr-WEB-INF-web.xml文件(配置solr_home的位置)

    • 解注其中的< env-entry>文件,并将solr_home的路径修改
        
           solr/home
           D:/Java/solr/solr2/solr_home
           java.lang.String
        
    
  7. 启动tomcat,访问

截图3.png
  • 出现以下界面说明,solr+tomcat已经配置完成
截图4.png
  1. 安装中文分词器

    1. 配置 IKAnalyzer 的 jar 包

      • 将solr安装包下的IK Analyzer 2012FF_hf1包下 IKAnalyzer2012FF_u1.jar 拷⻉到 Tomcat 的webapps/solr/WEB-INF/lib 下。
    2. IKAnalyzer 的配置⽂件

      • 在 Tomcat的webapps/solr/WEB-INF/ 下创建 classes ⽬录。(tomcat+solr时 已经新建过了)
      • 将 IKAnalyzer.cfg.xml、ext_stopword.dic 、mydict.dic copy 到 Tomcat的
        webapps/solr/WEB-INF/classes
    3. 修改schema.xml文件(solr_home-collection1-conf下)

       
           
       
      
    4. 验证是否完成

截图5.png

2.搭建SSM项目

  1. pom文件中添加依赖

    war
    
        
            
            4.3.6.RELEASE
        
    
        
            
            
                javax.servlet.jsp
                jsp-api
                2.2
                provided  
            
            
            
                javax.servlet
                javax.servlet-api
                3.1.0
                provided  
            
            
            
                jstl
                jstl
                1.2
            
            
            
                org.springframework
                spring-webmvc
                ${spring-version}
            
            
            
                com.fasterxml.jackson.core
                jackson-databind
                2.8.10
            
            
            
            
                mysql
                mysql-connector-java
                8.0.19
            
            
            
                org.mybatis
                mybatis
                3.4.4
            
            
            
                org.mybatis
                mybatis-spring
                1.3.2
            
            
            
                org.springframework
                spring-test
                ${spring-version}
            
            
            
                org.springframework
                spring-jdbc
                ${spring-version}
            
            
            
                org.aspectj
                aspectjweaver
                1.9.0
            
            
            
                com.alibaba
                druid
                1.1.15
            
            
            
                log4j
                log4j
                1.2.17
            
            
            
                junit
                junit
                4.12
            
            
            
                org.projectlombok
                lombok
                1.18.6
                provided
            
            
            
                javax.annotation
                javax.annotation-api
                1.3.2
            
    
            
            
                org.apache.solr
                solr-solrj
                4.10.3
            
            
                org.apache.commons
                commons-lang3
                3.1
            
    
    
        
    
    
        
            
            
                
                    src/main/java
                    
                        **/*.xml
                    
                    false
                
                
                    src/main/resources
                    
                        **/*.properties
                        **/*.xml
                    
                    false
                
            
            
                
                
                    org.apache.maven.plugins
                    maven-compiler-plugin
                    3.6.1
                    
                        1.8
                        1.8
                    
                
    
                
                
                    org.apache.tomcat.maven
                    tomcat7-maven-plugin
                    2.2
                    
                        /
                        80
                    
                
            
        
    
  2. 新建webapp包,并在包下新建WEB-INF包和index.html页面

  3. 在WEB-INF包下新建web.xml配置文件

    
    
    
        
        
            springDispatcherServlet
            org.springframework.web.servlet.DispatcherServlet
            
                contextConfigLocation
                classpath:spring-mvc.xml
            
        
    
        
            springDispatcherServlet
            /
        
        
        
            encode
            org.springframework.web.filter.CharacterEncodingFilter
            
                encoding
                UTF-8
            
            
                forceEncoding
                true
            
        
        
            encode
            /*
        
    
    
  4. resource包下的db.properties文件

    url=jdbc:mysql://localhost:3307/solr?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
    driver=com.mysql.cj.jdbc.Driver
    uname=root
    upass=root
    
    solr_server_url=http://localhost:8080/solr
    
    
  5. resource包下的log4j.properties文件(使用log4j第三方日志包)

    # 全局日志配置
    # 共有四个级别 ERROE,DEBUG,WARN,INFO
    log4j.rootLogger=ERROR, stdout, F
    # MyBatis 日志配置,可以指定到包下,也可以指定到类上,也可以指定到类中的某一个方法
    log4j.logger.com.yanm.dao.IUserDao=TRACE
    # 控制台输出
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%6p [%t] - %m%n
    
    #打印到文件myproj.log中
    log4j.appender.F = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.F.File =myproj.log
    log4j.appender.F.Append = true
    log4j.appender.F.Threshold = ERROE
    log4j.appender.F.layout=org.apache.log4j.PatternLayout
    log4j.appender.F.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss}-[%p %F\:%L]  %m%n
    
  6. resource包下的spring-mvc.xml文件

    
    
    
    
        
          
    
        
        
        
    
        
        
        
        
     
    
        
        
    
        
            
            
        
    
    
  7. resource包下的spring-mybatis.xml文件

    
    
    
    
    
        
        
        
        
            
            
            
            
        
    
        
            
            
            
            
        
    
        
            
            
        
    
        
        
            
        
    
        
        
            
                
                
                
                
            
        
    
        
            
            
        
    
        
        
    
    
    
  8. resource包下的mybatis-config.xml文件

    
    
    
    
        
        
            
        
    
    
  9. SSM项目搭建,可以写逻辑代码了

  10. entity层

    1. SolrData.java : 这是根据联合查询做的一个dto,应该放到dto下,现先放在entity下
    package com.ym.entity;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    
    //写的是一个Dto,应该放在dto包下,现在临时放在entity下,
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class SolrData {
    
        private long id;
        private String title;
        private String sellPoint;
        private long price;
        private String image;
        private String catName;
        private String itemDesc;
    }
    
  11. dao层接口

    1. SolrDataDao.java : 接口
    package com.ym.dao;
    
    import com.ym.entity.SolrData;
    
    import java.util.List;
    
    public interface SolrDataDao {
        List getAllData();
    }
    
    
  12. 与接口对应的mapper文件

    1. SolrDataDao.xml : 使用联合查询,返回结果映射成SolrData的类型
    
    
    
    
        
    
    
  13. service层接口及实现类

    1. ISolrDataService : 接口
    2. SolrDataServiceImpl.java : 接口的实现类
    package com.ym.service;
    
    import com.ym.entity.SolrData;
    
    import java.util.List;
    
    public interface ISolrDataService {
        //查询所有信息
        List getAllData();
        
        //判断是否已经写到solr中去了
        boolean dataFromDB2Solr();
    }
    
    • 实现类
    package com.ym.service.impl;
    
    import com.ym.dao.SolrDataDao;
    import com.ym.entity.SolrData;
    import com.ym.service.ISolrDataService;
    import org.apache.solr.client.solrj.SolrServerException;
    import org.apache.solr.client.solrj.impl.HttpSolrServer;
    import org.apache.solr.common.SolrInputDocument;
    import org.apache.solr.common.SolrInputField;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.io.IOException;
    import java.util.List;
    
    @Service
    public class SolrDataServiceImpl implements ISolrDataService {
    
        @Resource
        private SolrDataDao solrDataDao;
    
        @Value("${solr_server_url}")    //@Value注解,就可以拿到db中的solr_server_url的值
        private String baseURL;
    
        @Override
        public List getAllData() {
            List solrDatas = solrDataDao.getAllData();
            return solrDatas;
        }
    
        @Override
        public boolean dataFromDB2Solr() {
    
            Listlist=getAllData();
            //连接solr服务器
            HttpSolrServer server=new HttpSolrServer(baseURL);
            //创建文档对象
            SolrInputDocument document=null;
    
            try {
                for (SolrData sd : list) {
                    document=new SolrInputDocument();
                    //setField的name值一定要和schema.xml中的field中的值一定要相同,并且schema.xml中的field值不能重复,
                    // schema.xml中的field的值一定要和查询的字段相对应,可以不一样,但是一定要对应
                    document.setField("id",sd.getId());
                    document.setField("item_title",sd.getTitle());
                    document.setField("item_sell_point",sd.getSellPoint());
                    document.setField("item_price",sd.getPrice());
                    document.setField("item_image",sd.getImage());
                    document.setField("item_category_name",sd.getCatName());
                    document.setField("item_desc",sd.getItemDesc());
    
                    //向服务器中写入文档
                    server.add(document);
                }
                //向服务器中提交
                server.commit();
    
                return true;
            } catch (SolrServerException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return false;
        }
    }
    
  14. controller层

    1. SolrDataController.java
    package com.ym.controller;
    
    import com.ym.entity.SolrData;
    import com.ym.service.ISolrDataService;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    @RestController
    public class SolrDataController {
    
        @Resource
        private ISolrDataService solrDataService;
    
        //测试能否获取到内容
        @GetMapping("/solrData")
        public List getAllData(){
            List datas = solrDataService.getAllData();
            return datas;
        }
    
        @GetMapping("/dataFromDB2Solr")
        public boolean dataFromDB2Solr(){
            return solrDataService.dataFromDB2Solr();
        }
    }
    

3.SSM+(tomcat+solr)

  1. 修改scheme.xml文件(solr_home-collection1-conf下)

    1. 根据数据库中查询的字段添加field内容,其中添加的field必须要和数据库中的所要查询的内容对应,名字可以不一样,但是一定要对应,service层用的document对象,向solr中添加查询的内容时,也需要field中的这个name值
    2. service层实现类setField的name值一定要和schema.xml中的field中的值一定要相同,并且schema.xml中的field值不能重复,
    
     
     
     
     
     
     
     
     
     
     
    
    截图6.png
  1. solr下的tomcat

  2. 启动SSM项目

  3. 请求SSM项目中的/dataFromDB2Solr请求

  4. 访问solr下的tomcat验证是否配置完成

截图7.png

4.关键字查询,并使用分词器,设置关键字高亮

  • 此时是从solr服务器中取数据,而不是从数据库中查询
  • 修改SSM项目的代码
  1. service层接口及实现类

    1. ISolrDataService : 接口
    2. SolrDataServiceImpl.java : 接口的实现类
    package com.ym.service;
    
    import com.ym.entity.SolrData;
    
    import java.util.List;
    
    public interface ISolrDataService {
        //从数据库中找
        List getAllData();  
    
        //将从从数据库中查询的内容,保存到solr中
        boolean dataFromDB2Solr();
    
        //从solr中查找
        List getAllDataFromSolr(String keyword); 
    }
    
    • 实现类
    package com.ym.service.impl;
    
    import com.ym.dao.SolrDataDao;
    import com.ym.entity.SolrData;
    import com.ym.service.ISolrDataService;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.solr.client.solrj.SolrQuery;
    import org.apache.solr.client.solrj.SolrServerException;
    import org.apache.solr.client.solrj.impl.HttpSolrServer;
    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.apache.solr.common.SolrInputField;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    @Service
    public class SolrDataServiceImpl implements ISolrDataService {
    
        @Resource
        private SolrDataDao solrDataDao;
    
        /**
         * 通过value注解将db.properties文件中的solr_server_url注入给baseUrl
         */
        @Value("${solr_server_url}")
        private String baseURL;
    
        //从数据库中获取查询的内容
        @Override
        public List getAllData() {
            List solrDatas = solrDataDao.getAllData();
            return solrDatas;
        }
    
        //将从数据库中的内容,保存到solr中
        @Override
        public boolean dataFromDB2Solr() {
    
            Listlist=getAllData();
            //连接solr服务器
            HttpSolrServer server=new HttpSolrServer(baseURL);
            //创建文档对象
            SolrInputDocument document=null;
    
            try {
                for (SolrData sd : list) {
                    document=new SolrInputDocument();
                    //setField的name值一定要和schema.xml中的field中的值一定要相同,并且schema.xml中的field值不能重复,
                    // schema.xml中的field的值一定要和查询的字段相对应,可以不一样,但是一定要对应
                    document.setField("id",sd.getId());
                    document.setField("item_title",sd.getTitle());
                    document.setField("item_sell_point",sd.getSellPoint());
                    document.setField("item_price",sd.getPrice());
                    document.setField("item_image",sd.getImage());
                    document.setField("item_category_name",sd.getCatName());
                    document.setField("item_desc",sd.getItemDesc());
    
                    //向服务器中写入文档
                    server.add(document);
                }
                //向服务器中提交
                server.commit();
    
                return true;
            } catch (SolrServerException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return false;
        }
    
    
        /**
        * Description: 在solr中查询获取内容:根据关键字,包含分词,高亮
        * @author: YanM
        * @param:
        * @return:
        */
        @Override
        public List getAllDataFromSolr(String keyword) {
    
            List solrDatas=null;
    
            //借助baseURL来创建一个httpSolrService对象
            HttpSolrServer server=new HttpSolrServer(baseURL);
    
            //创建一个solrQuery对象
            SolrQuery query=new SolrQuery();
            try {
                //如果要检索的关键字为空,则全查
                if (StringUtils.isEmpty(keyword)){
                    query.setQuery("*:*");
                }else {
                    query.setQuery(keyword);
                }
                //设置df,默认的查询字段,在item_title上实现检索
                query.set("df","item_title");
                //设置start的值,返回的结果的第几条记录开始,一般分页的时候使用,默认从0开始
                query.set("start",0);
                //设置rows的值,值定返回结果最多多少条记录,默认是10,配合start实现分页
                query.set("rows",30);
    
                //通过query对象的setHight(boolean)来设置查询可高亮显示
                query.setHighlight(true);  //开启高亮组件,或用query.setParam("hl","true")
                //设置高亮的域
                query.addHighlightField("item_title");  //高亮字段
    
                //设置高亮的前缀
                query.setHighlightSimplePre("");//标记,高亮关键字前缀
                //设置高亮的后缀
                query.setHighlightSimplePost(""); //标记,高亮关键字后缀
    
                //System.out.println(query);
    
                //使用之前创建的httpSolrService对象调用query(query)方法将query对象所设置的查询条件加入进来得到一个查询响应对象
                QueryResponse response=server.query(query);
    
                //通过查询响应对象的getResult()方法的到SolrDocumentList对象
                Map>> map=response.getHighlighting();
    
                SolrDocumentList list = response.getResults();
    
                if (list!=null&&list.size()!=0){
                    solrDatas=new ArrayList<>();
                    SolrData s=null;
    
                    //遍历得到的SolrDocumentList对象
                    for (SolrDocument sd : list) {
                        s=new SolrData();
                        //SolrDocument对象的get(name)默认返回值为object
                        Object oid = sd.getFieldValue("id");
                        //将oid转换为long类型
                        long id=oid==null ?0:Long.parseLong((String)oid);
                        s.setId(id);
    
                        //通过高亮map对象设置solrData的title属性
                        s.setTitle(map.get(sd.getFieldValue("id")).get("item_title").get(0));
    
                        Object oprice = sd.getFieldValue("item_price");
                        long price =oprice==null?0:((long) oprice);
                        //设置价格
                        s.setPrice(price);
                        //设置卖点
                        s.setSellPoint((String)sd.getFieldValue("item_sell_point"));
                        //设置图片
                        s.setImage((String)sd.getFieldValue("item_image"));
                        //设置商品种类名称
                        s.setCatName((String)sd.getFieldValue("item_category_name"));
                        //设置条目描述
                        s.setItemDesc((String)sd.getFieldValue("item_desc"));
                        //将solrData对象加入到列表中
                        solrDatas.add(s);
                    }
                    return solrDatas;
                }
    
            } catch (SolrServerException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    }
    
  2. controller层

    1. SolrDataController.java
    package com.ym.controller;
    
    import com.ym.entity.SolrData;
    import com.ym.service.ISolrDataService;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.*;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    @Controller
    public class SolrDataController {
    
        @Resource
        private ISolrDataService solrDataService;
    
        //测试能否获取到内容
        @GetMapping("/solrData")
        @ResponseBody
        public List getAllData(){
            List datas = solrDataService.getAllData();
            return datas;
        }
    
        //将从数据库中的内容,保存到solr服务器中
        @GetMapping("/dataFromDB2Solr")
        @ResponseBody
        public boolean dataFromDB2Solr(){
            return solrDataService.dataFromDB2Solr();
        }
    
        //从solr中查找数据(rest风格)
        @GetMapping("/getDataFromSolr")
        @ResponseBody
        public List getDataFromSolrByKeyWord(@RequestParam(value = "kw",defaultValue = "")String kw){
            return solrDataService.getAllDataFromSolr(kw);
        }
    
        //从solr中查找数据,并且返回到页面
        @PostMapping("/getDataFromSolrByKeyWord")
        public String searchPage(@RequestParam(value = "kw",defaultValue = "")String kw, Model model){
    
            model.addAttribute("datas",solrDataService.getAllDataFromSolr(kw));
            return "search";
        }
    }
    
  3. 前端查询页面

    
    
    
        
        Title
    
    
    
    

    this is search page

    KeyWard :
  4. 前端查询结果显示

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    
        search
    
    
    
    

    this is search detail

    id title sellPoint price image catName itemDesc
    ${s.id} ${s.title} ${s.sellPoint} ${s.price} ${s.image} ${s.catName} ${s.itemDesc}
  5. 过程演示

    1. 输入"老人机",看查看结果


      截图8.png
    2. 页面显示查询结果


      截图10.png

你可能感兴趣的:(SSM+(solr+tomcat))