因爲沒有找到以前的項目案例,所以我簡單搭建了一個普通的maven工程,演示一下在項目中的使用,當然在實際項目中不會這麼簡單的使用,一般訪問量高的門戶網站都會用到分佈式架構,solr也才採用集羣的配置。本文只演示簡單操作,提供學習。
項目結構:
schema.xml配置文件中對應的業務域,以及使用的分詞器:
需要使用到的依賴,在上文中https://blog.csdn.net/qq_37138756/article/details/80804524已經說過了,這裏需要在配置文件中配置一個HttpSolrServer。
<!-- 單擊版solrJ -->
<bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<constructor-arg index="0" value="http://localhost:8085/solr/core"/>
</bean>
1.後臺管理系統中的一鍵導入索引(在初次使用索引庫中的時候):
前臺:
//導入數據到索引庫
function queryUser(){
var newurl="";
$.ajax({
url:"<%=request.getContextPath()%>/user/importUser",
type:"post",
async:false,
datatype:"html/text",
success:function(data){
if(data == "true"){
alert("導入索引成功");
}else{
alert("導入索引失敗");
}
},
error:function(){
alert("導入索引失敗");
}
})
return newurl;
}
在使用者點擊"一鍵導入索引"的時候,ajax去後臺請求數據庫,在dao層查詢到數據,將查詢到的數據寫入到solr索引中,需要注意的是,查詢到的數據屬性跟域對應
mapper層:
<mapper namespace="com.ssm.dao.IUserDao" >
<resultMap id="BaseResultMap" type="com.ssm.dto.User">
<result column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List">
id, name, password, age
</sql>
<!-- 查詢用戶-->
<select id="getAllUser" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
</select>
</mapper>
查詢出來數據以後,我是在service層處理數據信息,將數據寫入到solr索引庫。返回的數據信息爲List集合的User對象
User實體:
package com.ssm.dto;
public class User {
private String id;
private String name;
private String password;
private Integer age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
service層:
@Override public String importUser() { String tag; //查詢數據列表 List<User> allUser = userDao.getAllUser(); try { //遍歷數據列表 for (User user : allUser) { //創建文檔對象 SolrInputDocument document = new SolrInputDocument(); //向文檔對象中添加域 document.addField("id", user.getId()); document.addField("name", user.getName()); document.addField("age", user.getAge()); document.addField("password", user.getPassword()); //把文檔對象寫入索引庫 solrServer.add(document); } //提交 solrServer.commit(); return tag ="true"; } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return tag ="fasle"; }
2.搜索實現:
controller層:
接收頁面請求參數,調用服務層方法。根據頁面需要(當前頁,每頁顯示條數,總記錄數,總頁數,搜索到的數據信息列表)對返回結果進行處理,綁定到request域,跳轉的邏輯視圖。
/**
* 查詢solr服務器索引
* @param conditions 查詢條件
* @param page 頁數
* @param rows 條數
* @return
*/
@RequestMapping(value="/userList")
public String userList(String conditions, Integer page ,Integer rows ,Model model) {
UserResult userResult = null;
try {
userResult = userService.quertSolrUserAll(conditions , page , rows); //Solr中查詢
} catch (SolrServerException e) {
e.printStackTrace();
}
//把結果傳遞給頁面
model.addAttribute("query", conditions); //查詢條件
model.addAttribute("totalPages", userResult.getTotalPages()); //總頁數
model.addAttribute("page", page); // 頁數
model.addAttribute("recordCount", userResult.getRecordCount()); //條數
model.addAttribute("itemList", userResult.getUserList()); //文檔信息
return "index";
}
controller成接受到的返回對象爲UserResult,UserResult是定義返回對象:
package com.ssm.dto;
import java.util.List;
public class UserResult {
private Long recordCount;
private Integer totalPages;
private List<User> userList;
public Long getRecordCount() {
return recordCount;
}
public void setRecordCount(long numFound) {
this.recordCount = numFound;
}
public Integer getTotalPages() {
return totalPages;
}
public void setTotalPages(Integer totalPages) {
this.totalPages = totalPages;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
Service層:通過controller層傳遞過來的查詢條件,通過設置條件去solr中查詢索引文檔,並通過查詢域設置高亮,講查詢到的信息返回。
根據參數:
頁數:page,
條數:rows,
搜索關鍵字:conditions
當前頁碼由頁面傳來,每頁顯示有開發人員固定好。所以查詢開始位置就能知道,頁數也可以有總記錄數跟每頁顯示條數記錄下來。創建搜索對象SolrQuery,設置好查詢條件,調用SolrQuery方法獲得查詢結果返回。
/**
* 查詢solr服務器索引
* @param conditions 查詢條件
* @param page 頁數
* @param rows 條數
* @return
* @throws SolrServerException
*/
@Override
public UserResult quertSolrUserAll(String conditions, Integer page, Integer rows) throws SolrServerException {
//創建一個SolrQuery對象
SolrQuery query = new SolrQuery();
//設置查詢條件
query.setQuery(conditions);
//設置分頁條件
if(page <= 0){
page = 1;
}
query.setStart((page-1)*rows);
query.setRows(rows);
//設置默認搜索域
query.set("df", "name");
//開啓高亮顯示,顯示顏色爲紅色
query.setHighlight(true);
query.setHighlightSimplePre("<span style='color:red'>");
query.setHighlightSimplePost("</span>");
//根據query查詢索引庫
QueryResponse queryResponse = solrServer.query(query);
//取查詢結果
SolrDocumentList solrDocumentList = queryResponse.getResults();
//取查詢結果總記錄數
long numFound = solrDocumentList.getNumFound();
UserResult userResult = new UserResult(); //Solr結果返回對象
userResult.setRecordCount(numFound);
//取文檔列表,需要取高亮顯示
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
List<User> userList = new ArrayList<>();
for (SolrDocument solrDocument : solrDocumentList) {
User user = new User();
//獲取查詢域
user.setId((String)solrDocument.get("id"));
user.setAge((Integer)solrDocument.get("age"));
user.setPassword((String)solrDocument.get("password"));
//取高亮
List<String> list = highlighting.get(solrDocument.get("id")).get("name");
String name = "";
if(list!=null&&list.size()>0){
name = list.get(0);
}else{
name = (String)solrDocument.get("name");
}
user.setName(name);
//添加到user列表
userList.add(user);
}
userResult.setUserList(userList);//索引信息
//計算總頁數
int totalPage = (int) (numFound/rows);
if(totalPage%rows > 0) totalPage++;
//返回結果
userResult.setTotalPages(totalPage);
//返回結果
return userResult;
}
3.索引庫維護:
當對數據庫增加,刪除,修改的時候,我們需要對solr索引庫進行更新,可以寫一套服務接口使用,在操作數據庫的時候,來調用對應操作方法,來進行維護索引,達到實話同步的功能:
接口:
package com.ssm.service;
import org.apache.solr.client.solrj.SolrServerException;
import com.ssm.dto.User;
import java.io.IOException;
import java.util.List;
public interface SolrUtil {
//添加對象到全文檢索
void solrAdd(User user) throws IOException, SolrServerException;
//全文檢索中移除對象
void solrDeleteByIds(List<String> ids) throws IOException, SolrServerException;
void solrDeleteById(String id) throws IOException, SolrServerException;
}
實現類:
package com.ssm.service.Impl;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import javax.annotation.Resource;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
import com.ssm.dto.User;
import com.ssm.service.SolrUtil;
public class SolrUtilImpl implements SolrUtil {
@Resource
private HttpSolrServer solrServer;
/**
* 添加,修改索引
*/
@Override
public void solrAdd(User user) throws IOException, SolrServerException {
if(user != null){
//創建文檔對象
SolrInputDocument document = new SolrInputDocument();
//向文檔對象中添加域
document.addField("id", user.getId());
document.addField("name", user.getName());
document.addField("age", user.getAge());
document.addField("password", user.getPassword());
//把文檔對象寫入索引庫
solrServer.add(document);
solrServer.commit();
}
}
/**
* 刪除多條索引
*/
@Override
public void solrDeleteByIds(List<String> ids) throws IOException, SolrServerException {
if(ids != null && ids.size() > 0){
solrServer.deleteById(ids);
solrServer.commit();
}
}
/**
* 刪除索引
*/
@Override
public void solrDeleteById(String id) throws IOException, SolrServerException {
if(id != null){
solrServer.deleteById(id);
solrServer.commit();
}
}
}
以上就是利用solrj維護solr服務器文檔庫的簡要方法,已經能滿足基本使用詳情請參考:https://blog.csdn.net/u012476983/article/details/53992158