springDataSolr简单操作1
1 简单了解:
solr官方推荐的api为solrJ,solr不仅可以用于检索,也可以对数据进行存储,有时也会用来做nosql数据库做存储。本文用的是springDataSolr,底层封装的solrJ,让操作更加简化,可读性高,通过solrTemplate统一操作。
2适用场景:快速检索
对系统个别慢sql我们可以进行sql优化,可是当优化达到一定程度,而普遍系统访问量很大,此时 /坏笑,可以通过使用操作存储引擎的框架springDataSolr来提高查询效率。
3读写测试demo练习特点小结
除了查询,增删改都要有提交动作
1 单笔插入/更新 操作:
solrTemplate.saveBean(item);
solrTemplate.commit();
批量保存动作:
solrTemplate.saveBeans(beans);
solrTemplate.commit();
2按条件删除:
Query query = new SimpleQuery("*:*"); // |new SimpleQuery(criteria); 可以debug调试一下,两者本质一个意思,后置不用写表达式,编辑criteria后自动转换为表达式
solrTemplate.delete(query);
solrTemplate.commit();
根据id删除操作:
solrTemplate.deleteById("1");
solrTemplate.commit();
3
根据id查询对象操作:
TbItem item = solrTemplate.getById(1L, TbItem.class);
分页查询动作:
Query q = new SimpleQuery("*:*");
q.setOffset(m);//从m开始索引,不包含m
q.setRows(n);//每页记录数
ScoredPage<TbItem> page = solrTemplate.queryForPage(q, TbItem.class);
按条件查询:
Criteria arg0 = new Criteria("item_category").contains("手机3"); //new Criteria("item_category").is("手机1");
Query q = new SimpleQuery(arg0);
ScoredPage<TbItem> page = solrTemplate.queryForPage(q, TbItem.class);
4 对上面小结的具体样例
1 启动tomcat7或8
2 在solrhome的schema.xml文件里配置自定义域和复制域,调用demo,可以通过访问http://localhost:8080/solr/ 查看数据。
package com.msyd.test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
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 com.msyd.pojo.TbItem;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-solr.xml")
public class TestSolrTemplate {
@Autowired
private SolrTemplate solrTemplate;
/**首先先插入,然后注释掉,仅留title,和id再次执行做更新操作
* 然后执行testFindById,看控制台信心返回为:华为mate456nullnull ,说明更新时要全量更新,不然没有set值的字段最后会被更新为null*/
@Test
public void testAdd() {
TbItem item = new TbItem();
item.setId(22L);
item.setTitle("华为mate456");
/* item.setCategory("手机2");
item.setBrand("华为2");
item.setSeller("华为官方旗舰店2");
item.setGoodsId(12L);
item.setPrice(new BigDecimal(10000.99));*/
solrTemplate.saveBean(item);
solrTemplate.commit();
}
/**根据id查询记录*/
@Test
public void testFindById() {
TbItem item = solrTemplate.getById(1L, TbItem.class);
System.out.println(item.getTitle() + item.getCategory() + item.getSeller());
}
/**根据id删除记录*/
@Test
public void testdeleteById() {
solrTemplate.deleteById("1");
solrTemplate.commit();
}
/**批量添加*/
@Test
public void testBatchSave() {
List<TbItem> beans = new ArrayList<TbItem>();
for (int i = 1; i <= 30; i++) {
TbItem item = new TbItem();
item.setId(Long.parseLong("1" + i));
item.setTitle("华为mate" + i);
item.setCategory("手机" + i);
item.setBrand("华为");
item.setSeller("华为官方旗舰店");
item.setGoodsId(6L);
item.setPrice(new BigDecimal(10000.99 + i));
beans.add(item);
}
solrTemplate.saveBeans(beans);
solrTemplate.commit();
}
/**分页查询*/
@Test
public void testPageQuery() {
Query q = new SimpleQuery("*:*");
q.setOffset(20);//从20开始索引,不包含20
q.setRows(20);//每页记录数
ScoredPage<TbItem> page = solrTemplate.queryForPage(q, TbItem.class);
for (TbItem tbItem : page.getContent()) {
System.out.println(tbItem.getTitle() + " " + tbItem.getPrice() + " " + tbItem.getBrand());
}
System.out.println("总数" + page.getTotalElements() + ",总页数:" + page.getTotalPages());
}
/**条件查询*/
@Test
public void testConsQuery() {
Criteria arg0 = new Criteria("item_category").contains("手机3"); //new Criteria("item_category").is("手机1");
/*Criteria arg0 = new Criteria("item_title").contains("华为mate");//不好用,推断:原因可能跟类型为分词器有关,因为不是字符串类型
q.addCriteria(arg0);*/
Query q = new SimpleQuery(arg0);
ScoredPage<TbItem> page = solrTemplate.queryForPage(q, TbItem.class);
for (TbItem tbItem : page.getContent()) {
System.out.println(tbItem.getTitle() + " " + tbItem.getCategory() + " " + tbItem.getBrand());
}
}
/**批量删除记录*/
@Test
public void testDele() {
Query query = new SimpleQuery("*:*");
solrTemplate.delete(query);
solrTemplate.commit();
}
}