品优购项目笔记(五):SpringDataSolr

springDataSolr

介绍

这是spring组织生产的一个操作solr的工具,底层使用的是solrj,使用它可以将solrj那种面向命令的操作改为面向对象的操作。

入门小例子

一、创建项目,引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-solr</artifactId>
            <version>1.5.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
        </dependency>
    </dependencies>

二、添加applicationContext-solr.xml配置文件

<?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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:solr="http://www.springframework.org/schema/data/solr"
       xsi:schemaLocation="http://www.springframework.org/schema/data/solr
  		http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- solr服务器地址 -->
    <solr:solr-server id="solrServer" url="http://192.168.200.128:8080/solr" />
    <!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
    <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
        <constructor-arg ref="solrServer" />
    </bean>
</beans>

三、创建pojo,将属性使用@Field注解对应到solr的域名中

package cn.itcast.pojo;

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

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

public class Item implements Serializable {
    /**
     * 商品id,同时也是商品编号
     */
    @Field
    private Long id;

    /**
     * 商品标题
     */
    @Field("item_title")
    private String title;

    /**
     * 商品卖点
     */
    private String sellPoint;

    /**
     * 商品价格,单位为:元
     */
    @Field("item_price")
    private BigDecimal price;

    private Integer stockCount;

    /**
     * 库存数量
     */
    private Integer num;

    /**
     * 商品条形码
     */
    private String barcode;

    /**
     * 商品图片
     */
    @Field("item_image")
    private String image;

    /**
     * 所属类目,叶子类目
     */
    private Long categoryid;

    /**
     * 商品状态,1-正常,2-下架,3-删除
     */
    private String status;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新时间
     */
    private Date updateTime;

    private String itemSn;

    private BigDecimal costPirce;

    private BigDecimal marketPrice;

    private String isDefault;

    @Field("item_goodsid")
    private Long goodsId;

    private String sellerId;

    private String cartThumbnail;

    @Field("item_category")
    private String category;

    @Field("item_brand")
    private String brand;

    private String spec;

    @Field("item_seller")
    private String seller;

  //...省略

增删改操作

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext-solr.xml"})
public class TestIndexManager {
    @Autowired
    private SolrTemplate solrTemplate;

    @Test
    public void testIndexCreateAndUpdateOne() {
        Item item = new Item();
        item.setId(1L);
        item.setTitle("三星手机");
        item.setCategory("手机");
        item.setPrice(new BigDecimal("9999"));
        item.setBrand("三星");
        //保存
        solrTemplate.saveBean(item);
        //提交
        solrTemplate.commit();
    }

    @Test
    public void testIndexCreateAndUpdateMany() {
        List<Item> itemList = new ArrayList<>();
        for (long i = 0; i < 100; i++) {
            Item item = new Item();
            item.setId(i);
            item.setTitle("三星手机"+i);
            item.setCategory("手机");
            item.setPrice(new BigDecimal("9999"));
            item.setBrand("三星");
            itemList.add(item);
        }
        //保存
        solrTemplate.saveBeans(itemList);
        //提交
        solrTemplate.commit();
    }

    @Test
    public void testDelete() {
        //1.根据主键域id删除
        //solrTemplate.deleteById("1");
        //2.删除所有
        //创建查询对象
        Query query = new SimpleQuery("*:*");
        solrTemplate.delete(query);
        //提交
        solrTemplate.commit();
    }
}

查询操作

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext-solr.xml"})
public class TestIndexSearch {
    @Autowired
    private SolrTemplate solrTemplate;

    @Test
    public void testQuery() {
        //创建查询对象
        //Query query = new SimpleQuery("*:*");
        Query query = new SimpleQuery();
        //创建查询条件对象
        Criteria criteria = new Criteria("item_title").contains("手机");
        //查询对象中放入查询条件
        query.addCriteria(criteria);
        //从第几条开始查询
        query.setOffset(11);
        //设置每页查询多少条
        query.setRows(20);

        //查询并返回结果
        ScoredPage<Item> items = solrTemplate.queryForPage(query, Item.class);

        //总记录数
        long totalElements = items.getTotalElements();
        //总页数
        int totalPages = items.getTotalPages();
        //查询到的数据集合
        List<Item> content = items.getContent();
        //每页有多少条数据
        int numberOfElements = items.getNumberOfElements();

        System.out.println("-------------");
    }
}

索引库导入库存表数据

一、添加配置文件

applicationContext.xml

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  
  <context:component-scan base-package="cn.itcast.core.util"></context:component-scan>
   
   
</beans>

applicationContext-solr.xml

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:solr="http://www.springframework.org/schema/data/solr"
	xsi:schemaLocation="http://www.springframework.org/schema/data/solr 
  		http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- solr服务器地址 -->
	<solr:solr-server id="solrServer" url="http://192.168.200.128:8080/solr" />

   
	<!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
	<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
		<constructor-arg ref="solrServer" />
	</bean>
</beans>

二、给item的pojo的属性添加上@Field注解,注意动态域的添加方式

@Dynamic
@Field("item_spec_*")
private Map<String,String> specMap;
public class Item implements Serializable {
    /**
     * 商品id,同时也是商品编号
     */
    @Field
    private Long id;

    /**
     * 商品标题
     */
    @Field("item_title")
    private String title;

    /**
     * 商品卖点
     */
    private String sellPoint;

    /**
     * 商品价格,单位为:元
     */
    @Field("item_price")
    private BigDecimal price;

    private Integer stockCount;

    /**
     * 库存数量
     */
    private Integer num;

    /**
     * 商品条形码
     */
    private String barcode;

    /**
     * 商品图片
     */
    @Field("item_image")
    private String image;

    /**
     * 所属类目,叶子类目
     */
    private Long categoryid;

    /**
     * 商品状态,1-正常,2-下架,3-删除
     */
    private String status;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新时间
     */
    @Field("item_updatetime")
    private Date updateTime;

    private String itemSn;

    private BigDecimal costPirce;

    private BigDecimal marketPrice;

    private String isDefault;

    @Field("item_goodsid")
    private Long goodsId;

    private String sellerId;

    private String cartThumbnail;

    @Field("item_category")
    private String category;

    @Field("item_brand")
    private String brand;

    private String spec;

    @Field("item_seller")
    private String seller;

    @Dynamic
    @Field("item_spec_*")
    private Map<String,String> specMap;
    //。。。省略
}

三、向索引库添加数据

查询条件对象Criteria对象

  • is:将查询关键字使用对应这个域的分词器进行切分词,然后将切分出来的每个词进行查询
  • contains:相当于数据库中like模糊查询
@Component
public class DataImportToSolr {
    @Autowired
    private SolrTemplate solrTemplate;
    @Autowired
    private ItemDao itemDao;

    public void importItemDataToSolr(){
        ItemQuery itemQuery = new ItemQuery();
        ItemQuery.Criteria criteria = itemQuery.createCriteria();
        criteria.andStatusEqualTo("1");
        List<Item> itemList = itemDao.selectByExample(itemQuery);
        if (itemList!=null){
            for (Item item : itemList) {
                //获取json格式字符串
                String specJsonStr = item.getSpec();
                Map map = JSON.parseObject(specJsonStr, Map.class);
                item.setSpecMap(map);
            }
            //保存
            solrTemplate.saveBeans(itemList);
            //提交
            solrTemplate.commit();
        }

    }

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:spring/applicationContext*.xml");
        DataImportToSolr bean = (DataImportToSolr)context.getBean("dataImportToSolr");
        bean.importItemDataToSolr();
    }
}

在这里插入图片描述

简单搜索

业务:在搜索框中输入关键字,查询商品

SearchController

@RestController
@RequestMapping("/itemsearch")
public class SearchController {
    @Reference
    private SearchService searchService;
    /**
     * 返回:查询到的集合,当前页,每页展示多少条,总条数,总页数
     */
    @RequestMapping("/search")
    public Map<String,Object> search(@RequestBody Map paramMap){
        Map<String, Object> resultMap = searchService.search(paramMap);
        return resultMap;
    }
}

SearchService

@Service
public class SearchServiceImpl implements SearchService {
    @Autowired
    private SolrTemplate solrTemplate;


    @Override
    public Map<String, Object> search(Map paramMap) {
        /**
         * 获取查询条件
         */
        //获取查询关键字
        String keywords = String.valueOf(paramMap.get("keywords"));
        //当前页
        Integer pageNumber = Integer.parseInt(String.valueOf(paramMap.get("pageNo")));
        //每页查询条数
        Integer pageSize = Integer.parseInt(String.valueOf(paramMap.get("pageSize")));

        /**
         * 封装查询对象
         */
        //创建查询对象
        Query query = new SimpleQuery();
        //创建查询条件对象
        Criteria criteria = new Criteria("item_keywords").is(keywords);
        //将查询条件放入查询对象
        query.addCriteria(criteria);
        //设置从第几条开始查询
        if (pageNumber == null || pageNumber <= 0){
            pageNumber = 1;
        }
        Integer start = (pageNumber-1)*pageSize;
        query.setOffset(start);
        //设置每页查询多少条
        query.setRows(pageSize);

        /**
         * 查询并返回结果
         */
        ScoredPage<Item> items = solrTemplate.queryForPage(query, Item.class);

        Map<String,Object> resultMap = new HashMap<>();
        //查询到的结果集
        resultMap.put("rows",items.getContent());
        //总页数
        resultMap.put("totalPages",items.getTotalPages());
        //总条数
        resultMap.put("total",items.getTotalElements());
        return resultMap;
    }
}

猜你喜欢

转载自blog.csdn.net/Sakuraaaaaaa/article/details/106646121