spring-data-solr的配置及使用(二)

时间:2024-04-03 22:41:15

上一篇我们已经分析了spring-data-solr    https://blog.csdn.net/weixin_42333583/article/details/82628887

接下来我们就带大家认识一下spring-data-solr在项目中的使用

首先大家需要solr服务器安装好,  直接访问solr的地址,这样下面操作的步骤更直观一些.

spring-data-solr的配置及使用(二)

 

第一步:导包

需要导入测试的包,另外需要导入下面的这个包,哈哈,很明显这也是spring框架帮我封装好的,跟spring-data-redis一样简单配置就可以使用.

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

 

第二步:获取solrTemplate  在resouorce目录下直接创建solr相关的配置,这样才能使用solrTemplate

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:solr="http://www.springframework.org/schema/data/solr"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                          http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/solr http://www.springframework.org/schema/data/solr/spring-solr.xsd">

    <!--solr服务器地址-->
    <solr:solr-server id="solr" url="http://127.0.0.1:8080/solr"></solr:solr-server>
    <!--solrtemplate获取-->
    <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
        <constructor-arg ref="solr"/>
    </bean>

</beans>

第三步:创建pojo,并在pojo的成员变量属性上加相应的标签

此标签里面的内容一定是对应solrhome里面的schema-xml里面配置好的相应字段

普通字段只用加@Filed("schema.xml中相应的字段")

动态字段要加两个标签   @Dynamic     @Field("item_spec_*")

以下是l\solr-4.10.2-apach-tomcat2\solrhome\collection1\conf 路径下的shema.xml中的配置,所以pojo里面的字段需要跟这些字段对相应着

spring-data-solr的配置及使用(二)

pojo如下:

package com.pyg.pojo;

import org.apache.solr.client.solrj.beans.Field;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

public class TbItem implements Serializable{
    @Field
    private Long id;

    @Field("item_title")
    private String title;

    @Field("item_price")
    private BigDecimal price;

    @Field("item_imag")
    private String image;

    @Field("item_goodsid")
    private Long goodsId;

    @Field("item_category")
    private String category;

    @Field("item_brand")
    private String brand;

    @Field("item_seller") 
    private String seller;   
 
    @Dynamic
    @Field("item_spec_*")
    private String spec;
    省略getter和setter方法....

   

第四步: 注入solrTemplate后直接使用

package com.pyg.solr.test;

import com.pyg.pojo.TbItem;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class TbItemCURD {
   
    @Autowired
    private SolrTemplate solrTemplate;
    
    //------------------------增加单个对象操作-----------------------------------------------
    @Test
    public void add(){
        TbItem item = new TbItem();
        item.setId(1L);
        item.setPrice(new BigDecimal(1999));
        item.setBrand("小米");
        solrTemplate.saveBean(item);
        solrTemplate.commit();
    }
    
    //------------------------增加多个对象-----------------------------------------------
    @Test
    public void multiAdd(){
        List<TbItem> list= new ArrayList<TbItem>();
        for(int i=1;i<=100;i++){
            TbItem item = new TbItem();
            item.setId(i+0L);
            item.setBrand("华为"+i);
            item.setPrice(new BigDecimal(2000+i));
            item.setNum(99999);
            item.setTitle("华为荣耀系列产品");
            item.setStatus("1");
            list.add(item);
        }
        solrTemplate.saveBeans(list);
        solrTemplate.commit();
    }
    
    //------------------------根据主键查询一个对象-----------------------------------------------
    @Test
    public void findOne(){
        TbItem item = solrTemplate.getById(1L, TbItem.class);
        System.out.println("title:"+item.getTitle());
    }

    
    //------------------------分页查询-----------------------------------------------
    @Test
    public void findByOther(){
        Query query=new SimpleQuery("*:*");
        query.setOffset(0);
        query.setRows(10);
        ScoredPage<TbItem> tbItems = solrTemplate.queryForPage(query, TbItem.class);
        List<TbItem> content = tbItems.getContent();//获取内容
        for (TbItem tbItem : content) {
            System.out.println("brand:"+tbItem.getBrand());
        }
        System.out.println("总条数"+tbItems.getTotalElements());//获取总条数
        System.out.println("本页展示的条数"+tbItems.getTotalPages());//获取本页展示的条数
    }
    
//-----------条件查询(注意条件查询只能对支持分词的字段查询,其余均无法查询)-------------
    @Test
    public void multifind(){
        Query query = new SimpleQuery();
        Criteria contains = new Criteria("item_title").contains("华为");
        query.addCriteria(contains);

        ScoredPage<TbItem> tbItems = solrTemplate.queryForPage(query, TbItem.class);
        List<TbItem> content = tbItems.getContent();
        for (TbItem tbItem : content) {
            System.out.println(tbItem.getTitle());
        }
    }
    
    //---------------------------按主键删除------------------------------------
    @Test
    public void deleteById(){
        solrTemplate.deleteById("1");
        solrTemplate.commit();
    }

    //删除全部数据
    @Test
    public void deleteAll(){
        SimpleQuery query = new SimpleQuery("*:*");
        solrTemplate.delete(query);
        solrTemplate.commit();
    }

    //修改操作不用写,主键只要一样就会覆盖
}