1. 程式人生 > >lucene對校園網資料的全文檢索

lucene對校園網資料的全文檢索

Lucene是apache軟體基金會4 jakarta專案組的一個子專案,是一個開放原始碼的全文檢索引擎工具包。程式設計師們不僅使用它構建具體的全文檢索應用,而且將之整合到各種系統軟體中去,以及構建Web應用。不同版本的lucene之間還是有一定的差異的。專案裡我使用的是3.0.3版本,以編寫的校園網資料模組為例,對lucene的一些基本原理和用法將直接在下面的原始碼和註釋中介紹。

實現效果如下



1、首先匯入lucene相關的jar包


2、前端搜尋html及返回結果展示

<form id="search-form" action="/schoolnet/other.do?flag=searchdatas&searchpageNow=1"method="post" name="searchdatas" target="blank" onsubmit="return checksearch()">
search_result.jsp
<div class="site-nav">
					<span>當前位置 : </span><a href="/schoolnet/login.do?flag=goIndexUI">首頁</a>
					<a href="/schoolnet/login.do?flag=goHomeUI" title="">個人主頁</a>>>資料搜尋
				</div>
				<c:if test="${action=='searchdatas' }">	<div class="page-news">
					<div class="content">
						<div class="mes_response" id="mes_response">
						<c:set var="heightshow" value="<span style='color:red'>${search}</span>"></c:set>
						<c:set var="allr" value="<span style='color:red'>${allrows}</span>"></c:set>
							<table>
								<tr>
									<th class="news-time">您搜尋的“<span>${heightshow}</span>”, 共有<span>${allr}</span>個結果</div></th>
								</tr>
								<c:forEach var="data" items="${datas }" varStatus="status">
								<tr>
 								   <td>
										<c:if test="${fn:substringAfter(data.docu, '.')=='txt'}"><img src="/schoolnet/images/front/txt.png" width="25px" height="25px"/></c:if>
										<c:if test="${fn:substringAfter(data.docu, '.')=='pdf'}"><img src="/schoolnet/images/front/pdf.gif"  width="25px" height="25px"/></c:if>
										<c:if test="${fn:substringAfter(data.docu, '.')=='doc'}"><img src="/schoolnet/images/front/word.png" width="25px" height="25px"/></c:if>
										<c:if test="${fn:substringAfter(data.docu, '.')=='ppt'}"><img src="/schoolnet/images/front/ppt.png" width="25px" height="25px"/></c:if>
										<c:if test="${fn:substringAfter(data.docu, '.')=='zip'}"><img src="/schoolnet/images/front/zip.ico"  width="25px" height="25px"/></c:if>
										<c:if test="${fn:substringAfter(data.docu, '.')=='docx'}"><img src="/schoolnet/images/front/word.png" width="25px" height="25px"/></c:if>
										<span class="word4"><a
													href="/schoolnet/datas.do?flag=godatasshowUI&datasid=${data.id }&typeid=${data.datasecondtype.id}"
													class="xh" onclick="readgt(this)" id=""
													onmouseover="this.style.color='#333';"
													onmouseout="this.style.color='#666';"
													style="color: #000; font-weight: bold; text-decoration: none">${fn:replace(data.title, search, heightshow)}</a>
										</span><span style="float:right"></span><br/>
										<span style="color: #555">${fn:replace(data.content, search, heightshow)}</span>
									</td>
								</tr>
								</c:forEach>
							</table>
						</div>
3、建立索引

java程式碼

//path就是當前這個web應用是絕對路徑 D:\apache-tomcat-7.0.27\webapps\schoolnet
		String path=request.getSession().getServletContext().getRealPath("/")+"\\Index\\";
		//lucene中的檔案操作都是通過這Directory來實現的。Directory的實現類可以分為檔案目錄,記憶體目錄和目錄的代理類及工具類。
		//這裡使用最簡單的檔案目錄FSDirectory的子類SimpleFSDirectory
		Directory dir = new SimpleFSDirectory(new File(path));
		//判斷是否已經存在索引目錄,是則在原索引上追加內容,否則覆蓋
		boolean exist = IndexReader.indexExists(dir);
		IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(
				Version.LUCENE_30), !exist, IndexWriter.MaxFieldLength.LIMITED);
		try {
			//根據專案實際情況,按需建立對應的索引,先查出資料
			List<Datas> dataList=userService.executeQueryByPage("from Datas where dataecondtype.datafirsttype.id=1", null, 0, 1000);
			//將資料寫進索引,一個document實際就是對應一條記錄
			for (int i = 0; i < dataList.size(); i++) {
				//id要儲存,不用索引。因為我們輸入的是想搜尋的內容,id對於查詢暫時用不到,但id佔儲存空間小且後面拿物件很需要,所有要儲存。
				//title(標題)、content(內容)要分詞,索引,但不儲存.由於他們太大了, 
				Document doc = new Document();
				//對id的檢索策略:儲存欄位值,但不索引
				doc.add(new Field("id", dataList.get(i).getId().toString(), Field.Store.YES,
						Field.Index.NOT_ANALYZED));
				//對title的檢索策略::不儲存欄位值,分詞建索引
				doc.add(new Field("title", dataList.get(i).getTitle(), Field.Store.NO,
						Field.Index.ANALYZED));
				//對content的檢索策略::不儲存欄位值,分詞建索引
				doc.add(new Field("content", dataList.get(i).getContent(), Field.Store.NO,
						Field.Index.ANALYZED));
				writer.addDocument(doc);
			}
			writer.optimize();
			PrintWriter out = null;
			response.setCharacterEncoding("utf-8");
			response.setContentType("text/html;charset=utf-8");
			try {
				out = response.getWriter();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			out.print("<script>alert('建立索引成功');window.history.go(-1);</script>");
		} finally {
			//必須關閉資源
			writer.close();
		}

生成對應索引檔案


4、搜尋

	//獲取搜尋關鍵字
		String search=request.getParameter("search");
		int PagesSize=20;
		String pageNow=request.getParameter("searchpageNow");
		int pageNows=Integer.valueOf(pageNow);
		request.setAttribute("searchpageNow", pageNows);
		request.setAttribute("PagesSize", PagesSize);
		request.setAttribute("search", search);
		request.setAttribute("action", "searchdatas");
		//path就是當前這個web應用是絕對路徑 D:\apache-tomcat-7.0.27\webapps\schoolnet
		String path=request.getSession().getServletContext().getRealPath("/")+"\\Index\\";
		File file=new File(path);
		//還沒建立全文索引
		if (!file.exists()) {
			
		}else {
			//lucene中的檔案操作都是通過這Directory來實現的。Directory的實現類可以分為檔案目錄,記憶體目錄和目錄的代理類及工具類。
			//這裡使用最簡單的檔案目錄FSDirectory的子類SimpleFSDirectory
			Directory dir = new SimpleFSDirectory(file);
			//建立dir的檢索器
			Searcher searcher = new IndexSearcher(dir);
			try {
				//建立標準的分析器
				Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
				//構造一個布林查詢
				BooleanQuery bq = new BooleanQuery();
				//使用MultiFieldQueryParser,同時在索引的多個域中搜索同一個關鍵字。搜尋策略:title或content滿足條件即可。
				Query query = MultiFieldQueryParser.parse(Version.LUCENE_30, search,
							new String[]{"title","content"},new BooleanClause.Occur[]{BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD}, analyzer);
				//將query新增到布林查詢中。搜尋策略:title和content必須滿足條件。	
				bq.add(query, BooleanClause.Occur.MUST);
				//獲取相匹配的搜尋條件的前100個搜尋結果
				TopDocs docs = searcher.search(bq, 100);
				//獲取doc裡儲存的id
				List<Integer> list = new ArrayList<Integer>(docs.scoreDocs.length);
				ScoreDoc[] hits = docs.scoreDocs;
				for (int i = 0; i < hits.length; i++) {
					Document d = searcher.doc(hits[i].doc);
					list.add(Integer.valueOf(d.getField("id").stringValue()));
				}
				//根據id獲取對應的實體
				List<Datas> dataList = new ArrayList<Datas>(list.size());
				for (Object id : list) {
					dataList.add((Datas)userService.findById(Datas.class,(Integer) id));
				}
				int allrows=dataList.size();
				int PageCount=(allrows-1)/PagesSize+1;
				if(pageNows<1)
				{
					pageNows=1;
				}
				if(pageNows>PageCount)
				{
					pageNows=PageCount;
				}
				request.setAttribute("datas", dataList);
				request.setAttribute("PageCount", PageCount);
				request.setAttribute("allrows", allrows);
			} finally {
				//必須關閉資源
				searcher.close();
			}
		}
執行效果





相關推薦

lucene校園網資料全文檢索

Lucene是apache軟體基金會4 jakarta專案組的一個子專案,是一個開放原始碼的全文檢索引擎工具包。程式設計師們不僅使用它構建具體的全文檢索應用,而且將之整合到各種系統軟體中去,以及構建Web應用。不同版本的lucene之間還是有一定的差異的。專案裡我使用的是3

Lucene系列一之全文檢索

Lucene是一套用於全文檢索和搜尋的開放原始碼程式庫,由Apache軟體基金會支援和提供。Lucene提供了一個簡單卻強大的應用程式介面,能夠做全文索引和搜尋,在Java開發環境裡Lucene是一個成熟的免費開放原始碼工具;就其本身而論,Lucene是現在並且是這幾年,最受歡迎的免費Java資

Lucene&solr:全文檢索學習

例如:搜尋一堆檔案中含有java單詞的檔案-->Lucene·可以解決 資料庫搜尋 資料分類 非結構化資料查詢方式 弊端:相當慢 如何實現全文索引 全文檢索的運用場景 索引過程 搜尋過程

《從Lucene到Elasticsearch:全文檢索實戰》學習筆記一

img 要求 用戶查詢 tex sea 系統 Lucene ext 早期 今天,我主要給大家講一下信息檢索概念。 ? ? ? ?信息檢索: ? ? ? ?互聯網時代的飛速發展使人們進入了信息爆炸時代,據統計全球的互聯網用戶已達到30億,在各個網站及移動app在每個分鐘 產生

《從Lucene到Elasticsearch:全文檢索實戰》學習筆記二

天我給大家講講分詞演算法       分詞演算法概述:詞是語義的最小單位。分詞對搜尋引擎的作用很大,可以促進搜尋引擎程式自動識別語句的含義,可以提高搜尋結果的匹配度,分析的質量也將直接影響了搜尋結果的精確度。分詞存在於文字索引的建立過程和使用者提交檢索過程。利用相同的分詞器把短

《從Lucene到Elasticsearch:全文檢索實戰》學習筆記三

數據庫 核心 但是 .net 實戰 cse 內容 acl elastics 今天我給大家講講倒排索引。 索引是構成搜索引擎的核心技術之一,它在日常生活中是非常常見的,比如我看一本書的時候,我首先會看書的目錄,通過目錄可以快速定位到具體章節的頁碼,加快對內容的查詢

《從Lucene到Elasticsearch:全文檢索實戰》學習筆記四

思維方式 ear 作者 邏輯 優先 原創 blog article 開源 今天我給大家講講布爾檢索模型基本概念 布爾檢索模型: 檢索模型是判斷文檔內容與用戶相關性的核心技術,以大規模網頁搜索為例,在海量網頁中與用戶查詢關鍵詞相關的網頁可能會有成千上萬個,甚至耕

基於Sphinx+MySQL的千萬級資料全文檢索(搜尋引擎)架構設計

[文章作者:張宴 本文版本:v1.0 最後修改:2008.07.27 轉載請註明原文連結:http://blog.s135.com/post/360/]  前言:本文闡述的是一款經過生產環境檢驗的千萬級資料全文檢索(搜尋引擎)架構。本文只列出前幾章的內容節選,不提供全文內容。

《從Lucene到Elasticsearch:全文檢索實戰》學習筆記五

今天我給大家講講tf-idf權重計算 tf-idf權重計算:        tf-idf(中文詞頻-逆文件概率)是表示計算詞項對於一個文件集或語料庫中的一份檔案的重要程度。詞項的重要性隨著它在文件中出現的次數成正比,會隨著它在文件集中出現的頻率成反比。如果一個詞項在

使用lucene實現簡單的全文檢索

<dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>6.0.0</version

使用Lucenedoc、docx、pdf、txt文件進行全文檢索功能的實現

這裡講一下使用Lucene對doc、docx、pdf、txt文件進行全文檢索功能的實現。 涉及到的類一共有兩個: LuceneCreateIndex,建立索引: package com.yhd.test.poi; import java.io.BufferedReader; impo

全文檢索學習歷程目錄結構Lucene、ElasticSearch

wql elong f2c xiang bench ros dml bst nsh Linux%20Shell%E7%B3%BB%E5%88%97%E6%95%99%E7%A8%8B%E4%B9%8B%E4%BA%8C%E7%AC%AC%E4%B8%80%E4%B8%AAS

Lucene全文檢索引擎

getname 通過 nal dem 檢索 數據庫 project cep 關閉 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSch

服務器上所有Word文件做全文檢索的解決方案-Java

不可 servlet 並保存 保存文件 客戶端請求 打開文檔 word文檔 文件的 文本文件 一、背景介紹 Word文檔與日常辦公密不可分,在實際應用中,當某一文檔服務器中有很多Word文檔,假如有成千上萬個文檔時,用戶查找打開包含某些指定關鍵字的文檔就變得很困難,目

Lucene 全文檢索入門

sdi 執行 option getter itl .get png 廣泛 fig 博客地址:http://www.moonxy.com 一、前言 Lucene 是 apache 軟件基金會的一個子項目,由 Doug Cutting 開發,是一個開放源代碼的全文檢索引擎工具包

lucene教程--全文檢索技術

bss bsp 詳細 .cn 總結 bbs 實例demo 技術 .net 1 Lucene 示例代碼 https://blog.csdn.net/qzqanzc/article/details/80916430 2 Lucene 4.7 學習及實例

Lucene全文檢索

介紹 Lucene是一個開放原始碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文字分析引擎。 A)什麼是索引庫 索引庫是Lucene的一個重要的儲存結構,它包括二部份:原始記錄表(value),詞彙/關

全文檢索-Lucene簡介

全文檢索的引入 全文資料的搜尋通常我們採取以下兩種方式:順序掃描和全文檢索。        在瞭解順序掃描和全文檢索之前,我們先要了解幾個概念:     結構化資料:指具有“固定格式”或“有限長

2018-11-13 全文檢索 -lucene

① 什麼是全文檢索 1.資料的分類 1)結構化資料 格式固定,長度固定,資料型別固定。 例如資料庫中的資料 2)非結構化資料 word文件,pdf文件,郵件,html 格式不固定,長度不固定,資料型別不固定   2.資料的查詢 1)結構化資料的查詢 sql語句,查詢結構化資料的方法,簡

Lucene全文檢索之倒排索引實現原理、API解析【2018.11】

》 官網 http://lucene.apache.org/ 下載地址:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/java/7.5.0/ 》 Lucene的全文檢索是指什麼: 程式掃描文件