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持續更新中…

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