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();

    }
}

5持续更新中…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章