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