pring Data Solr:
这是一个spring组织生产的一个操作solr的工具, 底层使用的是solrJ. 使用它可以将solrj那种原有的面向命令的操作
改为面向对象的操作, Java程序员使用起来更容易理解, 方便.
spring Data Solr里面的Criteria对象中的方法, is和contains的区别:
contains: 是相当于数据库中like模糊查询的方式, 将查询关键字当成一个整体进行模糊查询
is: 将查询关键字使用对应这个域的分词器进行切分词, 然后将切分出来的每个词, 进行查询.
1.导入相关jar
<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>
2.写applicationContext-solr.xml 的xml,IOC配置文件
<?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>
3.提前配置好,数据库中商品对象的业务域,和实体类和业务域映射的注解(具体参照,solr简介篇:超链接)
实体类示例:注意get和set方法,省略了
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;
4.增加或者修改操作,删除操作代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-solr.xml")
//solr 索引库的,增删操作
public class TestIndexManager {
@Autowired
private SolrTemplate solrTemplate;
//增加或者修改的操作
@Test
public void testIndexCreatAndUpdate(){
//存放索引数据的集合
List<Item> itemList = new ArrayList<>();
for (long i = 1; i <=100 ; i++) {
Item item = new Item();
item.setId(i);
item.setTitle("三星手机");
item.setCategory("手机");
item.setPrice(new BigDecimal("9999"));
item.setBrand("三星");
//添加单个索引进集合
itemList.add(item);
}
//保存商品详情进solr,
// 注意,如果添加单个索引,不是集合,方法名用saveBean,没有S,不然报id异常
solrTemplate.saveBeans(itemList);
//提交操作
solrTemplate.commit();
}
//删除的的操作
@Test
public void del(){
//根据索引的对象的id 进行删除
// solrTemplate.deleteById("1");
//创建solr jar包中的Query对象,写查询条件
Query query = new SimpleQuery("*:*");
//根据查询条件进行删除
solrTemplate.delete(query);
//提交操作
solrTemplate.commit();
}
}
5.搜索的操作代码
public class TestIndexSearch {
@Autowired
private SolrTemplate solrTemplate;
@Test
public void testSearch() {
//创建查询对象
//Query query = new SimpleQuery("*:*");
//创建查询对象
Query query = new SimpleQuery();
//创建查询条件对象, 注意这里的Criteria对象和mybatis中的那个不是同一个, 只是同名而已
Criteria criteria = new Criteria("item_title").contains("手机");
//查询对象中放入查询条件
query.addCriteria(criteria);
//从第几条开始查询
query.setOffset(11);
//设置每页查询多少条数据
query.setRows(20);
//查询并返回结果
ScoredPage<Item> items = solrTemplate.queryForPage(query, Item.class);
//总页数
int totalPages = items.getTotalPages();
//查询到的总记录数
long totalElements = items.getTotalElements();
//查询到的数据集合
List<Item> content = items.getContent();
//每页有多少条数据
int numberOfElements = items.getNumberOfElements();
System.out.println("====结束======");
}
}