基于ASP.NET的lucene.net全文搜索实现步骤_实用技巧

在做项目的时候,需求添加全文搜索,选择了lucene.net方向,调研了一下,基本实现了需求,现在将它分享给大家。理解不深请多多包涵。

在完成需求的时候,查看的大量的资料,本文不介绍详细的lucene.net工程建立,只介绍如何对文档进行全文搜索。对于如何建立lucene.net的工程请大家访问

使用lucene.net搜索分为两个部分,首先是创建索引,创建文本内容的索引,其次是根据创建的索引进行搜索。那么如何对文档进行索引呢,主要是对文档的内容进行索引,关键是提取出文档的内容,按照常规实现,由简到难,提取txt格式的文本相对比较简单,如果实现了提取txt文本,接下来就容易多了,万丈高楼平地起,这就是地基。

1.首先创建ASP.NET页面。

这是一个极其简单的页面,创建页面之后,双击各个按钮生成相应的点击事件,在相应的点击事件中实现程序设计。

2.实现索引部分。

前面已经说到了,索引主要是根据文本内容建立索引,所以要提取文本内容。创建提取txt格式文档文本内容的函数。

复制代码 代码如下:

 
//提取txt文件
public static string FileReaderAll(FileInfo fileName)
{
//读取文本内容,并且默认编码格式,防止出现乱码
StreamReader reader = new StreamReader(fileName.FullName, System.Text.Encoding.Default);
string line = "";
string temp = "";
//循环读取文本内容
while ((line = reader.ReadLine()) != null)
{
temp += line;
}
reader.Close();
//返回字符串,用于lucene.net生成索引
return temp;
}

文本内容已经提取出来了,接下来要根据提取的内容建立索引

复制代码 代码如下:

 
protected void Button2_Click(object sender, EventArgs e)
{
//判断存放文本的文件夹是否存在
if (!System.IO.Directory.Exists(filesDirectory))
{
Response.Write("<script>alert('指定的目录不存在');</script>");
return;
}
//读取文件夹内容
DirectoryInfo dirInfo = new DirectoryInfo(filesDirectory);
FileInfo[] files = dirInfo.GetFiles("*.*");
//文件夹判空
if (files.Count() == 0)
{
Response.Write("<script>alert('Files目录下没有文件');</script>");
return;
}
//判断存放索引的文件夹是否存在,不存在创建
if (!System.IO.Directory.Exists(indexDirectory))
{
System.IO.Directory.CreateDirectory(indexDirectory);
}
//创建索引
IndexWriter writer = new IndexWriter(FSDirectory.Open(new DirectoryInfo(indexDirectory)),
analyzer, true, IndexWriter.MaxFieldLength.LIMITED);

for (int i = 0; i < files.Count(); i++)
{
string str = "";
FileInfo fileInfo = files[i];
//判断文件格式,为以后其他文件格式做准备
if (fileInfo.FullName.EndsWith(".txt") || fileInfo.FullName.EndsWith(".xml"))
{
//获取文本
str = FileReaderAll(fileInfo);
}
Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document();
doc.Add(new Lucene.Net.Documents.Field("FileName", fileInfo.Name, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED));
//根据文本生成索引
doc.Add(new Lucene.Net.Documents.Field("Content", str, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED));
doc.Add(new Lucene.Net.Documents.Field("Path", fileInfo.FullName, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NO));
//添加生成的索引
writer.AddDocument(doc);
writer.Optimize();
}
writer.Dispose();
Response.Write("<script>alert('索引创建成功');</script>");
}

3.索引创建完了,接下来就是搜索,搜索只要按照固定的格式书写不会出现错误。

复制代码 代码如下:

 
protected void Button1_Click(object sender, EventArgs e)
{
//获取关键字
string keyword = TextBox1.Text.Trim();
int num = 10;
//关键字判空
if (string.IsNullOrEmpty(keyword))
{
Response.Write("<script>alert('请输入要查找的关键字');</script>");
return;
}

IndexReader reader = null;
IndexSearcher searcher = null;
try
{
reader = IndexReader.Open(FSDirectory.Open(new DirectoryInfo(indexDirectory)), true);
searcher = new IndexSearcher(reader);
//创建查询
PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(analyzer);
wrapper.AddAnalyzer("FileName", analyzer);
wrapper.AddAnalyzer("Path", analyzer);
wrapper.AddAnalyzer("Content", analyzer);
string[] fields = { "FileName", "Path", "Content" };

QueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, fields, wrapper);
//根据关键字查询
Query query = parser.Parse(keyword);

TopScoreDocCollector collector = TopScoreDocCollector.Create(num, true);

searcher.Search(query, collector);
//这里会根据权重排名查询顺序
var hits = collector.TopDocs().ScoreDocs;

int numTotalHits = collector.TotalHits;

//以后就可以对获取到的collector数据进行操作
for (int i = 0; i < hits.Count(); i++)
{
var hit = hits[i];
Lucene.Net.Documents.Document doc = searcher.Doc(hit.Doc);
Lucene.Net.Documents.Field fileNameField = doc.GetField("FileName");
Lucene.Net.Documents.Field pathField = doc.GetField("Path");
Lucene.Net.Documents.Field contentField = doc.GetField("Content");
//在页面循环输出表格
strTable.Append("<tr>");
strTable.Append("<td>" + fileNameField.StringValue + "</td>");
strTable.Append("</tr>");
strTable.Append("<tr>");
strTable.Append("<td>" + pathField.StringValue + "</td>");
strTable.Append("</tr>");
strTable.Append("<tr>");
strTable.Append("<td>" + contentField.StringValue.Substring(0, 300) + "</td>");
strTable.Append("</tr>");
}
}
finally
{
if (searcher != null)
searcher.Dispose();

if (reader != null)
reader.Dispose();
}
}

现在整个lucene.net搜索全文的过程就建立完了,现在可以搜索txt格式的文件,搜索其他格式的文件在以后添加,主要核心思想就是提取各个不同格式文件的文本内容。

显示效果如下:

在以后的博文里继续接受搜索其他格式的文档。

时间: 2024-11-08 23:24:00

基于ASP.NET的lucene.net全文搜索实现步骤_实用技巧的相关文章

基于ASP.NET MVC的ABP框架入门学习教程_实用技巧

为什么使用ABP我们近几年陆续开发了一些Web应用和桌面应用,需求或简单或复杂,实现或优雅或丑陋.一个基本的事实是:我们只是积累了一些经验或提高了对,NET的熟悉程度. 随着软件开发经验的不断增加,我们发现其实很多工作都是重复机械的,而且随着软件复杂度的不断提升,以往依靠经验来完成一些简单的增删改查的做法已经行不通了.特别是用户的要求越来越高,希望添加的功能越来多,目前这种开发模式,已经捉襟见肘.我很难想象如何在现有的模式下进行多系统的持续集成并添加一些新的特性. 开发一个系统时,我们不可避免的

基于Asp.Net MVC4 Bundle捆绑压缩技术的介绍_实用技巧

很高兴,最近项目用到了Asp.Net MVC4 + Entity Framework5,发现mvc4加入了Bundle.Web API等技术,着实让我兴奋,以前是用第三方的,这里主要说说Bundle技术. 很多大网站都没有用Bundle技术造成很多资源浪费与性能的牺牲,别小瞧 用上了你会发现他的好处: 将多个请求捆绑为一个请求,减少服务器请求数  没有使用Bundle技术,debug下看到的是实际的请求数与路径   使用Bundle技术,并且拥有缓存功能调试设置为Release模式并按F5或修改

asp.net和ajax实现智能搜索功能代码_实用技巧

第一步,先做好搜索页面 复制代码 代码如下: <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://

创建基于ASP.NET的SMTP邮件服务的具体方法_实用技巧

首先,我们创建一个继承命名空间System.Net.Sockets的TcpClient类的类.TcpClient类提供简单的方法用于连接,发送,接收网络的数据流.GetStream方法用于创建一个网络流(NetworkStream).读和写网络流(NetworkStream)的方法用于发送数据给远程主机和从远程主机接收网络流. 复制代码 代码如下: public class ClientConnection : TcpClient{private NetworkStream _NetworkSt

asp.net基于替换模版页的形式生成静态页的方法_实用技巧

本文实例讲述了asp.net基于替换模版页的形式生成静态页的方法.分享给大家供大家参考,具体如下: 第一步:新建项目,创建一个简单模版页:TemplatePage.htm <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="

ASP.NET 页面之间传递值方式优缺点比较_实用技巧

本题考查面试者对ASP.NET中多页面传值的理解是否全面.因为ASP.NET的页面表单提交到自身,完成回传的功能,所以默认情况下不能使用POST方式进行多页面传值.关于这些传值方式的分析如下所示.1.URL传值这是经典的传值方式,这种方法的使用非常简单,不过所传递的值是会显示在浏览器的地址栏上的,而且不能传递对象.所以这种方法一般用于传递的值少且安全性要求不高的情况下.在*.aspx页面开发中可以使用超级链接文本进行传值,如以下代码所示.<asp:HyperLink runat="serv

ASP.NET中Webservice安全 实现访问权限控制_实用技巧

一. 概述: Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务.它逻辑性的为 其他应用程序提供数据与服务.各应用程序通过网络协议和规定的一些标准数据格式(Http,XML,Soap)来访问Web Service,通过Web Service内部执行得到所需结果.由于它通过internet进行调用,必然存在网络用户都可以调用的安全问题.如何实现webservice的访问 权限限制,是使用webservice用户

ASP.NET web.config中 数据库连接字符串加密解密_实用技巧

虽然不怎么新鲜,但相信还是有许多人不知道,好,不说废话,直接给方法:开始--->运行,输入cmd,接着输入以下内容 加密: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef "connectionStrings" "你的Web项目路径" 解密: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -

Asp.net动态生成html页面的方法分享_实用技巧

    此功能适用于后台数据库功能不强的web站点,即大部分文本不是存放在数据库的记录中,而是放在html文件或者xml文件中,仅仅把索引放到数据库中,如文章标题.类别.查询关键字等.这样适合于后台没有诸如MS Sql Server这样的数据库支持的Web站点.  适用于新闻发布系统,比如sina.163等都是采用动态生成html页面的.     适用于需动态定制页面的程序.比如论坛.聊天室等.可以加载定制好的html页面,来加强美观.     思路     1. 利用如Dw-Mx这样的工具生成