solr与ssm集成

  • solr的对象都是一个文档对象,所以要把对象 dao 转换为文档给 solr

  • 在 schema.xml 中,设置业务系统Field,其中 field 标签中的 name 和 数据库里要搜索的字段一致。

    <field name="item_title" type="text_ik" indexed="true" stored="true"/>
    <field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
    <field name="item_price"  type="long" indexed="true" stored="true"/>
    <field name="item_image" type="string" indexed="false" stored="true" />
    <field name="item_category_name" type="string" indexed="true" stored="true" />
    <field name="item_desc" type="text_ik" indexed="true" stored="false" />
    ​
    <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
    <copyField source="item_title" dest="item_keywords"/>
    <copyField source="item_sell_point" dest="item_keywords"/>
    <copyField source="item_category_name" dest="item_keywords"/>
    <copyField source="item_desc" dest="item_keywords"/>
  • springmvc.xml

    <!--1.添加命名空间 context 和 mvc -->
    <!--2. context 扫描 controller -->
    <!--3. mvc 注解驱动-->
    <!--4. mvc 默认-->
    <mvc:default-servlet-hanlder />
    <!--5. 引入 spring-mybatis 文件-->
  • 创建 spring-mybatis.xml

    <!--1. 引入 namespace,context,aop,tx -->
    <!--2. context 扫描 service-->
    <!--3. context 引入 配置文件 db.properties-->
    <!--4. bean 注入 DruidSourceData-->
    <!--5. bean 注入 SQLSessionFactoryBean,spring 和 MyBatis 的完美结合-->
    <bean id="sf" class="SQLSessionFactoryBean">
        <property name="typeAliasesPackage" value="com.james.pojo"/>
        <property name="mapperLocation" value="classpath:com/james/dao/*.xml"/>
        <property name="datasource" ref="ds"/>
        <property name="configlocation" value="classpath:mybatis-config.xml"/>
    </bean>
    <!--6. DAO接口所在包名,Spring会自动查找其下的类,MapperScannerConfigurer-->
    <bean class="MapperScannerConfigurer">
        <property name="basePackage" value="com.james.dao" />
        <property name="sqlSessionFactoryBeanName" value="sf" />
    </bean>
    <!--7. 事务管理器-->
      <!-- tx 通知-->
    <!--8. aop 指定切点-->
  • SolrData.java

    public class SolrData {
        //对应sql中字段起的别名
        private String id;
        private String title;
        private long price;
        private String sellPoint;
        private String image;
        private String catName;
        private String itemDesc;
    }
  • 完成dto,文件传输对象,不完全对应数据库的某张表,而是多表联合查询想要的字段。SoleDao.xml

    <mapper namespace="com.james.dao.ISolrDao">
      <select id="getAllData" resultType="solrData">
        select
      i.id, i.title, i.price, i.sell_point sellPoint, i.image,
      c.name catName, d.item_desc itemDesc
      from
      tb_item i,
      tb_item_cat c,
      tb_item_desc d
      where i.cid = c.id
      and i.id = d.item_id
      limit 100
        </select>
    </mapper>
  • 将数据库中的数据写入Solr服务器,SolrController.java

    @GetMapping("/dataFrom2Solr")
    public boolean dataFromDB2Solr() {
        return solrService.dataFromDB2Solr();
    }
    ​
  • SolrServiceimpl.java

    //我们想要把数据库中取出来的solrData的值set到scame.xml。
    public boolean dataFromDB2Solr() {
        List<SolrData> list = solrDao.getAllData();
        HttpSolrServer server = new HttpSolrServer(baseURL);
        SolrInputDocument document = null;
        for(SolrData sd:list) {
            ducument = new SolrInputDocument();
            document.setField("id",sd.getId());
          document.setField("item_title",sd.getTitle());
            document.setField("");
            server.add(document);
        }
        server.commit();
        return true;
    }
    ​
    //根据关键字查找
    public List<SolrData> getDataFromSolrByKeyWord(String keyword, int pageNum, int pageSize){
      HttpSolrServer server = new HttpSolrServer(baseURL);
      SolrQuery query = new SolrQuery();
      // 设置查询是否有关键字
      try {
        if(StringUtils.isEmpty(keyword)){
          query.setQuery("*:*");
        }else{
          query.setQuery(keyword);
        }
            //  设定默认查询的搜索域
            query.set("df", "item_title");
            int start = (pageNum - 1) * pageSize;
            int rows = pageSize;
    ​
            query.set("start", start);
            query.set("rows", rows);
          
            //  根据查询条件搜索索引库
            QueryResponse response = server.query(query);
            //  从搜索到的数据中获取商品列表
            SolrDocumentList list = response.getResults();
            //  将商品列表放到dto中。
            List<SolrData> datas = new ArrayList<>();
            SolrData s = null;
            //取出solr服务器中获取到的值放入dto中。
            for (SolrDocument sd : list) {
                System.out.println(sd + "00000000000");
                s = new SolrData();
                s.setId((String) sd.getFieldValue("id"));
                s.setCatName((String) sd.getFieldValue("item_category_name"));
                Object priceTemp = sd.getFieldValue("item_price");
                s.setPrice(priceTemp == null ? 0: (long)priceTemp);
                s.setImage((String) sd.getFieldValue("item_image"));
                s.setItemDesc((String) sd.getFieldValue("item_desc"));
                s.setTitle((String) sd.getFieldValue("item_title"));
                s.setSellPoint((String) sd.getFieldValue("item_sell_point"));
    ​
                datas.add(s);
          }
          return datas;
        } catch (SolrServerException e) {
          e.printStackTrace();
        }
        return null;
      }
    }
  • 应用场景,将数据库中的大文本数据存储进solr搜索引擎,可以替代模糊查询,细粒度分词可以让查询更加全面和灵活。

  • 完成 service,controller

  • 完成dao,xml,注意:因为是接口+xml的格式,xml 中的 namespace 要和 dao 接口的全路径一致。

  • mybatis-config.xml,配置 mybatis 一些特有的,比如日志,STDOUT_LOGGING

  • db.properties

  • 配置 web.xml,dispatchservlet,listener ,中文乱码等等

  • 添加依赖:

    1. druid / mysql / mybatis / mybatis-spring / spring-jdbc / spring-webmvc / jackson-databind ( jar ) / aspectJ / solr-solrJ / commons-lang / lombok /junit

  • 目录结构:

    1. 配置文件:web.xml

    2. resource 里 springmvc.xml

    3. spring-mybatis.xml

    4. db.properties

    5. mybatis-config.xml,

    6. com.james.pojo - SolrData.java

    7. dao,service

  • 新建一个 ssm 的 maven 项目,打包 war 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值