lucene對校園網資料的全文檢索
Lucene是apache軟體基金會4 jakarta專案組的一個子專案,是一個開放原始碼的全文檢索引擎工具包。程式設計師們不僅使用它構建具體的全文檢索應用,而且將之整合到各種系統軟體中去,以及構建Web應用。不同版本的lucene之間還是有一定的差異的。專案裡我使用的是3.0.3版本,以編寫的校園網資料模組為例,對lucene的一些基本原理和用法將直接在下面的原始碼和註釋中介紹。
實現效果如下
1、首先匯入lucene相關的jar包
2、前端搜尋html及返回結果展示
search_result.jsp<form id="search-form" action="/schoolnet/other.do?flag=searchdatas&searchpageNow=1"method="post" name="searchdatas" target="blank" onsubmit="return checksearch()">
3、建立索引<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>
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
使用Lucene對doc、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的全文檢索是指什麼: 程式掃描文件