品优购项目笔记(五)
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;
//。。。省略
}
三、向索引库添加数据
扫描二维码关注公众号,回复:
11493165 查看本文章
查询条件对象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;
}
}