文章目錄
Spring Data Solr
Spring Data Solr簡介
Spring Data Solr就是爲了方便Solr的開發所研製的一個框架,其底層是對SolrJ(官方API)的封裝
Spring Data Solr入門案例
1.環境搭建(思路)
- 引入依賴
- spring-data-solr
<dependencies>
<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>
</dependencies>
- 創建applicationContext-solr.xml
- 配置solr服務器地址
- 配置solrTemplate
<?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://127.0.0.1:8080/solr" />
<!-- solr模板,使用solr模板可對索引庫進行CRUD的操作 -->
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer" />
</bean>
</beans>
- 在實體類的屬性上配置與solr域的映射
- 使用@Field註解
- 使用@Field註解
2. 案例
- 增加和修改
增加和修改使用的是一個方法,當id在solr裏面不存在,添加,當id存在,修改
package cn.itcast.test;
import java.math.BigDecimal;
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.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import cn.itcast.pojo.TbItem;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-solr.xml")
public class testDemo1 {
@Autowired
private SolrTemplate solrTemplate;
/**
* 增加和修改
*/
@Test
public void add(){
TbItem tbItem = new TbItem();
tbItem.setId(1L);
tbItem.setTitle("華爲MATE10");
tbItem.setCategory("手機");
tbItem.setBrand("華爲");
tbItem.setSeller("華爲旗艦店");
tbItem.setGoodsId(10L);
tbItem.setPrice(new BigDecimal(3000.01));
solrTemplate.saveBean(tbItem);
solrTemplate.commit();
}
- 通過主鍵查詢
TbItem item = solrTemplate.getById(“1”,TbItem.class);
參數一:要查詢數據的主鍵
參數二:返回對象的class
/**
* 通過主鍵查詢
*/
@Test
public void findById(){
//傳入要查詢的主鍵ID,以及返回對象的class
TbItem item = solrTemplate.getById("1",TbItem.class);
System.out.println(item.getTitle());
}
- 通過主鍵刪除
傳入一個主鍵
注意:刪除以後要進行commit()
/**
* 通過主鍵刪除
*/
@Test
public void deleById(){
solrTemplate.deleteById("1");
solrTemplate.commit();
}
- 批量插入數據
solrTemplate.saveBeans(list);方法,傳入一個list集合
/**
* 批量插入數據
*/
@Test
public void addList(){
List list = new ArrayList();
for(int i = 0;i < 100;i++){
TbItem tbItem = new TbItem();
tbItem.setId(i+1L);
tbItem.setTitle("華爲MATE"+i);
tbItem.setCategory("手機");
tbItem.setBrand("華爲"+i);
tbItem.setSeller("華爲旗艦店");
tbItem.setGoodsId(10L);
tbItem.setPrice(new BigDecimal(3000.01));
list.add(tbItem);
}
solrTemplate.saveBeans(list);
solrTemplate.commit();
}
- 分頁查詢
/**
* 分頁查詢
*/
@Test
public void findByPage(){
//*:*:代表查詢任意列的任意值
Query query=new SimpleQuery("*:*");
//設置分頁的開始索引
query.setOffset(10);
//設置每頁查詢的數據數
query.setRows(20);
/**
* 分頁查詢需要兩個參數
* 參數一:查詢條件
* 參數二:返回對象的class
*/
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
//獲得查詢到的數據
List<TbItem> list = page.getContent();
for (TbItem tbItem : list) {
System.out.println("title"+tbItem.getTitle());
}
System.out.println("總記錄數"+page.getTotalElements());
System.out.println("總頁數"+page.getTotalPages());
}
- 條件查詢
/**
* 條件查詢
*/
@Test
public void findByMutil(){
//*:*:代表查詢任意列的任意值
Query query=new SimpleQuery("*:*");
//創建一個Criteria,在構造方法裏設置要查詢的字段名稱,後面設置條件:contains(表示包含)
Criteria criteria=new Criteria("item_category").contains("手機");
//設置多個條件:必須用criteria=criteria.and(字段名稱).條件
criteria=criteria.and("item_brand").contains("2");
query.addCriteria(criteria);
/**
* 分頁查詢需要兩個參數
* 參數一:查詢條件
* 參數二:返回對象的class
*/
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
//獲得查詢到的數據
List<TbItem> list = page.getContent();
for (TbItem tbItem : list) {
System.out.println("title"+tbItem.getTitle());
}
System.out.println("總記錄數"+page.getTotalElements());
System.out.println("總頁數"+page.getTotalPages());
}
- 刪除所有數據
/**
* 刪除所有數據
*/
@Test
public void deleAll(){
//設置刪除條件
Query query=new SimpleQuery("*:*");
//執行刪除
solrTemplate.delete(query);
//提交刪除
solrTemplate.commit();
}
SpringDataSolr域的與字段對應的配置
- 普通域存儲
在實體類上添加註解
- 動態域存儲
spring-data-solr搜索數據並將關鍵字高亮顯示
-
示例
-
後端代碼編寫
@Override
public Map search(Map searchMap) {
Map map = new HashMap();
HighlightQuery query=new SimpleHighlightQuery();
//設置高亮的域
HighlightOptions highlightOptions=new HighlightOptions().addField("item_title");
//設置高亮前綴
highlightOptions.setSimplePrefix("<em style='color:red'>");
//設置高亮後綴
highlightOptions.setSimplePostfix("</em>");
//設置高亮選項
query.setHighlightOptions(highlightOptions);
//設置查詢條件
Criteria criteria=new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
//完成高亮操作
HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);
for(HighlightEntry<TbItem> h: page.getHighlighted()){//循環高亮入口集合
TbItem item = h.getEntity();//獲取原實體類
if(h.getHighlights().size()>0 && h.getHighlights().get(0).getSnipplets().size()>0){
item.setTitle(h.getHighlights().get(0).getSnipplets().get(0));//設置高亮的結果
System.out.println(h.getHighlights().get(0).getSnipplets().get(0));
}
}
//將查詢結果存儲到Map集合並返回
map.put("rows", page.getContent());
return map;
}
- 這時我們在前端取數據時會發現取出數據裏面的HTML代碼並沒有被解析,而是原樣進行了輸出
這是因爲AngularJS的安全策略,angularJS爲了防止html攻擊採取的安全機制。這時我們需要使用$sce服務的trustAsHtml方法將該數據轉成信任的html代碼