solr-5.0.0全文檢索在項目中簡單使用

因爲沒有找到以前的項目案例,所以我簡單搭建了一個普通的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






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