在这里,我们将对 HTML 文件生成索引,然后通过一个 JSP 对其进行全文检索。
生成索引
/**
* PHPDocIndexer.java
* 用于对 PHPDoc 的 HTML 页面生成索引文件。
*/
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Date;
import java.text.DateFormat;
import java.lang.*;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.DateField;
class PHPDocIndexer
{
public static void main(String[] args) throws ClassNotFoundException, IOException
{
try {
Date start = new Date();
IndexWriter writer = new IndexWriter("/home/nio/indexes-phpdoc", new CJKAnalyzer(), true); //索引保存目录,必须存在
indexDocs(writer, new File("/home/nio/phpdoc-zh")); //HTML 文件保存目录
System.out.println("Optimizing ....");
writer.optimize();
writer.close();
Date end = new Date();
System.out.print("Total time: ");
System.out.println(end.getTime() - start.getTime());
} catch (Exception e) {
System.out.println("Class " + e.getClass() + " throws error!\n errmsg: " + e.getMessage());
} //end try
} //end main
public static void indexDocs(IndexWriter writer, File file) throws Exception
{
if (file.isDirectory()) {
String[] files = file.list();
for (int i = 0; i < files.length; i++) {
indexDocs(writer, new File(file, files[i]));
} //end for
} else if (file.getPath().endsWith(".html")) { //只对 HTML 文件做索引
System.out.print("Add file:" + file + " ....");
// Add html file ....
Document doc = new Document();
doc.add(Field.UnIndexed("file", file.getName())); //索引文件名
doc.add(Field.UnIndexed("modified", DateFormat.getDateTimeInstance().format(new Date(file.lastModified())))); //索引最后修改时间
String title = "";
String content = "";
String status = "start";
FileReader fReader = new FileReader(file);
BufferedReader bReader = new BufferedReader(fReader);
String line = bReader.readLine();
while (line != null) {
content += line;
//截取 HTML 标题 <title>
if ("start" == status && line.equalsIgnoreCase("><TITLE")) {
status = "match";
} else if ("match" == status) {
title = line.substring(1, line.length() - 7);
doc.add(Field.Text("title", title)); //索引标题
status = "end";
} //end if
line = bReader.readLine();
} //end while
bReader.close();
fReader.close();
doc.add(Field.Text("content", content.replaceAll("<[^<>]+>", ""))); //索引内容
writer.addDocument(doc);
System.out.println(" [OK]");
} //end if
}
} //end class
索引生成完之后,就需要一个检索页面,下边是搜索页面(search.jsp)的代码:
<%@ page language="java" import="javax.servlet.*, javax.servlet.http.*, java.io.*, java.util.Date, java.util.ArrayList, java.util.regex.*, org.apache.lucene.analysis.*, org.apache.lucene.document.*, org.apache.lucene.index.*, org.apache.lucene.search.*, org.apache.lucene.queryParser.*, org.apache.lucene.analysis.Token, org.apache.lucene.analysis.TokenStream, org.apache.lucene.analysis.cjk.CJKAnalyzer, org.apache.lucene.analysis.cjk.CJKTokenizer, com.chedong.weblucene.search.WebLuceneHighlighter" %>
<%@ page contentType="text/html;charset=GB2312" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>PHPDoc - PHP 简体中文手册全文检索</title>
<base target="main"><!-- 由于使用了 Frame,所以指定 target 到 main 窗口显示 -->
<style>
body {background-color: white; margin: 4px}
body, input, div {font-family: Tahoma; font-size: 9pt}
body, div {line-height: 18px}
u {color: red}
b {color: navy}
form {padding: 0px; margin: 0px}
.txt {border: 1px solid black}
.f {padding: 4px; margin-bottom: 16px; background-color: #E5ECF9; border-top: 1px solid #3366CC; border-bottom: 1px solid #3366CC; text-align: center;}
.d, .o {padding-left: 16px}
.d {color: gray}
.o {color: green}
.o a {color: #7777CC}
</style>
<script language="JavaScript">
function gotoPage(i)
{
document.frm.page.value = i;
document.frm.submit();
} //end function
</script>
</head>
<body>
<%
String keyVal = null;
String pageVal = null;
int offset = 0;
int curPage = 0;
int pages;
final int ROWS = 50;
//获取 GET 参数
try {
byte[] keyValByte = request.getParameter("key").getBytes("ISO8859_1"); //查找关键字
keyVal = new String(keyValByte);
pageVal = request.getParameter("page"); //页码
} catch (Exception e) {
//do nothing;
}
if (keyVal == null)
keyVal = new String("");
%>
<div class="f">
<form name="frm" action="./index.jsp" method="GET" onsubmit="this.page.value='0';return true;" target="_self">
<input type="text" name="key" class="txt" size="40" value="<%=keyVal%>" />
<input type="hidden" name="page" value="<%=pageVal%>" />
<input type="submit" value="搜 索" /><br />
<font color="green">提示:可使用多个关键字(使用空格隔开)提高搜索的准确率。</font>
</form>
<script language="JavaScript">
document.frm.key.focus();
</script>
</div>
<%
if (keyVal != null && keyVal.length() > 0) {
try {
curPage = Integer.parseInt(pageVal); //将当前页转换成整数
} catch (Exception e) {
//do nothing;
} //end try
try {
Date startTime = new Date();
keyVal = keyVal.toLowerCase().replaceAll("(or|and)", "").trim().replaceAll("\\s+", " AND ");
Searcher searcher = new IndexSearcher("/home/nio/indexes-phpdoc"); //索引目录
Analyzer analyzer = new CJKAnalyzer();
String[] fields = {"title", "content"};
Query query = MultiFieldQueryParser.parse(keyVal, fields, analyzer);
Hits hits = searcher.search(query);
StringReader in = new StringReader(keyVal);
TokenStream tokenStream = analyzer.tokenStream("", in);
ArrayList al = new ArrayList();
for (Token token = tokenStream.next(); token != null; token = tokenStream.next()) {
al.add(token.termText());
} //end for
//总页数
pages = (new Integer(hits.length()).doubleValue() % ROWS != 0) ? (hits.length() / ROWS) + 1 : (hits.length() / ROWS);
//当前页码
if (curPage < 1)
curPage = 1;
else if (curPage > pages)
curPage = pages;
//起始、终止下标
offset = (curPage - 1) * ROWS;
int end = Math.min(hits.length(), offset + ROWS);
//循环输出查询结果
WebLuceneHighlighter hl = new WebLuceneHighlighter(al);
for (int i = offset; i < end; i++) {
Document doc = hits.doc(i);
%>
<div class="t"><a href="/~nio/phpdoc-zh/<%=doc.get("file")%>"><%=hl.highLight(doc.get("title"))%></a></div>
<div class="d"><%=hl.highLight(doc.get("content").replaceAll("\n", " "), 100)%> ……</div>
<div class="o">
/~nio/phpdoc-zh/<%=doc.get("file")%>
-
<%=doc.get("modified")%>
</div>
<br />
<%
} //end for
searcher.close();
Date endTime = new Date();
%>
<div class="f">
检索总共耗时 <b><%=((endTime.getTime() - startTime.getTime()) / 1000.0)%></b> 秒,约有 <b><%=hits.length()%></b> 项符合条件的记录,共 <b><%=pages%></b> 页
<%
if (curPage > 1 && pages > 1) {
%>
| <a href="javascript:gotoPage(<%=(curPage-1)%>);" target="_self">上一页</a>
<%
} //end if
if (curPage < pages && pages > 1) {
%>
| <a href="javascript:gotoPage(<%=(curPage+1)%>)" target="_self">下一页</a>
<%
} //end if
} catch (Exception e) {
%>
<!-- <%=e.getClass()%> 导致错误:<%=e.getMessage()%> -->
<%
} //end if
} //end if
%>
</body>
</html>
分享到:
相关推荐
Lucene 全文检索实践.pdf(清晰版本)
基于lucene全文检索引擎实现的短文本匹配系统 ajax什么时候执行success,什么时候执行error 简单的说Ajax请求通过XMLHttpRequest对象发送请求,该对象有四个状态(readyState): 0-未初始化、1-正在初始化、2-发送...
全文检索概念、原理、Lucene&Solr的实践。
RI-Lucene 信息检索实践3
《信息检索》课程大作业3:基于Lucene的全文搜索引擎
搜索引擎功能设计主要包括,信息资源的集成,查询扩展模块,Lucene检索模块,结果可视化。 信息资源的集成主要使用网络爬虫技术,利用java语言的regex包和selenium插件实现模拟登录以获取新浪微博,豆瓣电影,百度...
Lucene实战,了解Lucene开源系统并付诸实践的经典之作,很快你就能上手写一个简单的操作系统
server 为django的目录, 主要包含有django文件(这东西我没用过, 不知道怎么用),和lucene的检索函数 util 为常用函数放置, 比如一些NLP函数 #问题 检索的时候会出现汉语部分有英语的情况 由于现在选用multi-un的语料...
整体思路 在实现新闻信息检索系统时首先进行了信息采集,信息采集结束之后使用 Lucene 提供的 api 构建索引库, 前端使用 jsp 接收用户查询,在后台使用 servlet 对用户查询进 行分词处理,之后到索引库中进行文档匹配, ...
全文索引/检索 为目标列表网站内容建立索引 提供内容的全文检索 自动分类 对目标列表网站内容进行分类 基本流程 网络蜘蛛 功能概要 目标文档地址队列 w/r 目标文档(网页)获取 目标文档保存 文档解析并得到新的目标...
在全文检索部分,结合Lucene介绍了搜索引擎的原理与进展。用简单的例子介绍了Lucene的最新应用方法,包括完整的搜索实现过程:从完成索引到搜索用户界面的实现。此外还进一步介绍了实现准实时搜索的方法,展示了Solr...
该系统利用 Lucene 强大的全文检索功能,实现了高效的公交线路搜索和查询功能。用户可以通过输入关键词或线路编号,快速地查询到符合条件的公交线路信息,并获取详细的站点信息、运行时刻表等相关数据。系统具有良好...
无论是学生还是开发者,都可以通过此系统深入理解并实践如何在Java环境下使用Lucene进行数据检索。此外,这个系统还可能包含用户界面,使得用户可以方便地输入查询条件,查看搜索结果。总的来说,这个公交搜索系统是...
针对企业电子文档搜索的现状和不足,本文研究了全文检索技术和全文检索工具Lucene,并将其引入到系统开发中,在主流的B/S分层架构基础上,重点对文本提取模块、中文词划分模块、索引模块和搜索模块进行了设计与实现...
实践为王:在学习过程中注重实践操作,通过实际项目加深理解。 持续反馈与调整:根据学习进度和反馈,适时调整学习策略,提高学习效果。 五、安全与责任 在使用SSM框架进行开发时,请确保遵循最佳实践和安全准则,...
Web信息检索与处理课程实验1——一个简易的搜索引擎 实验内容 利用Lucene等工具建立简单的搜索引擎: 1.网页预处理 2.创建索引(使用中科院中文分词工具ICTCLAS) 3.查询(实现简单的查询界面) 实验环境 编译...
更有深度学习、机器学习、自然语言处理和计算机视觉的实战项目源码,助您从理论走向实践,如果您已有一定基础,您可以基于这些源码进行修改和扩展,实现更多功能。 【期待与您同行】 我们真诚地邀请您下载并使用...
更有深度学习、机器学习、自然语言处理和计算机视觉的实战项目源码,助您从理论走向实践,如果您已有一定基础,您可以基于这些源码进行修改和扩展,实现更多功能。 【期待与您同行】 我们真诚地邀请您下载并使用...
更有深度学习、机器学习、自然语言处理和计算机视觉的实战项目源码,助您从理论走向实践,如果您已有一定基础,您可以基于这些源码进行修改和扩展,实现更多功能。 【期待与您同行】 我们真诚地邀请您下载并使用...
大二暑假参与时空数据检索项目,我做数据预处理部分,该项目是数据预处理,包括构建数据模型、去除固定词语表情、分词、去停用词、选择语言、生成用户词典、计算tf-idf、Lucene索引部分