Spring Data Solr

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註解
      在這裏插入圖片描述

2. 案例

  1. 增加和修改

增加和修改使用的是一個方法,當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();
	}
  1. 通過主鍵查詢

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());
	}
  1. 通過主鍵刪除

傳入一個主鍵
注意:刪除以後要進行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代碼

在這裏插入圖片描述

spring-data-solr進行分類查詢

在這裏插入圖片描述

spring-data-solr進行過濾查詢

在這裏插入圖片描述

發佈了48 篇原創文章 · 獲贊 10 · 訪問量 1207
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章