1 Spring Data Solr简介

虽然支持任何编程语言的能力具有很大的市场价值,你可能感兴趣的问题是:我如何将Solr的应用集成到Spring中?可以,Spring Data Solr就是为了方便Solr的开发所研制的一个框架,其底层是对SolrJ(官方API)的封装。

2 Spring Data Solr 入门小Demo

2.1 搭建工程

(1)创建maven工程,pom.xml中引入依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.data</groupId>
  4. <artifactId>spring-data-solr</artifactId>
  5. <version>1.5.5.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-test</artifactId>
  10. <version>4.2.4.RELEASE</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>junit</groupId>
  14. <artifactId>junit</artifactId>
  15. <version>4.9</version>
  16. </dependency>
  17. </dependencies>

(2)在src/main/resources下创建 applicationContext-solr.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:solr="http://www.springframework.org/schema/data/solr"
  6. xsi:schemaLocation="http://www.springframework.org/schema/data/solr
  7. http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd">
  12. <!-- solr服务器地址 -->
  13. <solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" />
  14. <!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
  15. <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
  16. <constructor-arg ref="solrServer" />
  17. </bean>
  18. </beans>

2.2 @Field注解

创建 cn.carven.pojo 包,将品优购的TbItem实体类拷入本工程 ,属性使用@Field注解标识 。 如果属性与配置文件定义的域名称不一致,需要在注解中指定域名称。

  1. public class TbItem implements Serializable {
  2. @Field
  3. private Long id;
  4. @Field("item_title")
  5. private String title;
  6. private String sellPoint;
  7. @Field("item_price")
  8. private BigDecimal price;
  9. private Integer stockCount;
  10. private Integer num;
  11. private String barcode;
  12. @Field("item_image")
  13. private String image;
  14. private Long categoryid;
  15. private String status;
  16. private Date createTime;
  17. private Date updateTime;
  18. private String itemSn;
  19. private BigDecimal costPirce;
  20. private BigDecimal marketPrice;
  21. private String isDefault;
  22. @Field("item_goodsid")
  23. private Long goodsId;
  24. private String sellerId;
  25. private String cartThumbnail;
  26. @Field("item_category")
  27. private String category;
  28. @Field("item_brand")
  29. private String brand;
  30. private String spec;
  31. @Field("item_seller")
  32. private String seller;
  33. .............
  34. }

2.3 增加(修改)

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration("classpath:applicationContext-solr.xml")
  3. public class TestTemplate {
  4. @Autowired
  5. private SolrTemplate solrTemplate;
  6. // 增加
  7. @Test
  8. public void testAdd() {
  9. TbItem item = new TbItem();
  10. item.setId(1L);
  11. item.setTitle("苹果8 PLUS");
  12. item.setCategory("手机10");
  13. item.setBrand("苹果");
  14. item.setSeller("苹果旗舰店");
  15. item.setGoodsId(2L);
  16. item.setPrice(new BigDecimal(3000.01));
  17. solrTemplate.saveBean(item);
  18. solrTemplate.commit();
  19. }
  20. }

2.4 按主键查询

  1. @Test
  2. public void FindById() {
  3. TbItem item = solrTemplate.getById(1L, TbItem.class);
  4. System.out.println(item.getTitle());
  5. }

2.5 按主键删除

  1. @Test
  2. public void deleteById() {
  3. solrTemplate.deleteById("1");
  4. solrTemplate.commit();
  5. }

2.6 批量插入

  1. // 先插入一些数据准备
  2. @Test
  3. public void addList() {
  4. List beans = new ArrayList();
  5. for (int i = 0; i < 100; i++) {
  6. TbItem item = new TbItem();
  7. item.setId(i + 1L);
  8. item.setTitle("苹果" + i + 1 + " PLUS");
  9. item.setCategory("手机10");
  10. item.setBrand("苹果");
  11. item.setSeller("苹果旗舰店" + i);
  12. item.setGoodsId(2L);
  13. item.setPrice(new BigDecimal(3000.01 + i));
  14. beans.add(item);
  15. }
  16. solrTemplate.saveBeans(beans);
  17. solrTemplate.commit();
  18. }

2.7 按条件查询

  1. // 分页查询
  2. @Test
  3. public void pageQuery() {
  4. // 构建查询对象
  5. Query query = new SimpleQuery("*:*");
  6. query.setOffset(20); // 开始索引
  7. query.setRows(20); // 每页记录大小
  8. ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
  9. for (TbItem item : page.getContent()) {
  10. System.out.println(item.getId() + " " + item.getTitle());
  11. }
  12. System.out.println("总记录数: " + page.getTotalElements());
  13. System.out.println("总页数: " + page.getTotalPages());
  14. }

2.8 条件查询

  1. // 条件查询
  2. @Test
  3. public void pageQueryMutil() {
  4. // 构建查询对象
  5. Query query = new SimpleQuery();
  6. Criteria criteria = new Criteria("item_category").is("手机10");
  7. criteria = criteria.and("item_brand").contains("苹果");
  8. query.addCriteria(criteria);
  9. query.setOffset(10); // 开始索引
  10. query.setRows(20); // 每页记录大小
  11. ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
  12. for (TbItem item : page.getContent()) {
  13. System.out.println(item.getId() + " " + item.getTitle());
  14. }
  15. System.out.println("总记录数: " + page.getTotalElements());
  16. System.out.println("总页数: " + page.getTotalPages());
  17. }

2.9 全部删除

  1. // 全部删除
  2. @Test
  3. public void deleteAll(){
  4. Query query = new SimpleQuery("*:*");
  5. solrTemplate.delete(query);
  6. solrTemplate.commit();
  7. }

3. 导入商品数据

3.1 @Dynamic注解

复制到品优购项目后,并修改TbItem.java,添加属性

  1. @Dynamic
  2. @Field("item_spec_*")
  3. private Map<String,String> specMap;
  4. public Map<String, String> getSpecMap() {
  5. return specMap;
  6. }
  7. public void setSpecMap(Map<String, String> specMap) {
  8. this.specMap = specMap;
  9. }

3.2 修改导入工具

  1. 原来为 table,需要自己转换一下
  2. {"cells":[{"value":"/**\n * 导入商品数据\n */\npublic void importItemData(){\n TbItemExample example=new TbItemExample();\n Criteria criteria = example.createCriteria();\n criteria.andStatusEqualTo(\"1\");//已审核\n List itemList = itemMapper.selectByExample(example);\n System.out.println(\"===商品列表===\");\n for(TbItem item:itemList){\n Map specMap= JSON.parseObject(item.getSpec());//将spec字段中的json字符串转换为map\n item.setSpecMap(specMap);//给带注解的字段赋值 \n System.out.println(item.getTitle()); \n }\n solrTemplate.saveBeans(itemList);\n solrTemplate.commit();\n System.out.println(\"===结束===\"); \n}\n","inlineStyles":{"color":[{"from":326,"to":397,"value":"#df402a"},{"from":398,"to":455,"value":"#df402a"}]}}],"heights":[40],"widths":[620]}