基于A(yíng)SP.NET的lucene.net全文搜索實(shí)現(xiàn)步驟
在做項(xiàng)目的時(shí)候,需求添加全文搜索,選擇了lucene.net方向,調(diào)研了一下,基本實(shí)現(xiàn)了需求,現(xiàn)在將它分享給大家。理解不深請(qǐng)多多包涵。
在完成需求的時(shí)候,查看的大量的資料,本文不介紹詳細(xì)的lucene.net工程建立,只介紹如何對(duì)文檔進(jìn)行全文搜索。對(duì)于如何建立lucene.net的工程請(qǐng)大家訪(fǎng)問(wèn)
使用lucene.net搜索分為兩個(gè)部分,首先是創(chuàng)建索引,創(chuàng)建文本內(nèi)容的索引,其次是根據(jù)創(chuàng)建的索引進(jìn)行搜索。那么如何對(duì)文檔進(jìn)行索引呢,主要是對(duì)文檔的內(nèi)容進(jìn)行索引,關(guān)鍵是提取出文檔的內(nèi)容,按照常規(guī)實(shí)現(xiàn),由簡(jiǎn)到難,提取txt格式的文本相對(duì)比較簡(jiǎn)單,如果實(shí)現(xiàn)了提取txt文本,接下來(lái)就容易多了,萬(wàn)丈高樓平地起,這就是地基。
1.首先創(chuàng)建ASP.NET頁(yè)面。

這是一個(gè)極其簡(jiǎn)單的頁(yè)面,創(chuàng)建頁(yè)面之后,雙擊各個(gè)按鈕生成相應(yīng)的點(diǎn)擊事件,在相應(yīng)的點(diǎn)擊事件中實(shí)現(xiàn)程序設(shè)計(jì)。
2.實(shí)現(xiàn)索引部分。
前面已經(jīng)說(shuō)到了,索引主要是根據(jù)文本內(nèi)容建立索引,所以要提取文本內(nèi)容。創(chuàng)建提取txt格式文檔文本內(nèi)容的函數(shù)。
//提取txt文件
public static string FileReaderAll(FileInfo fileName)
{
//讀取文本內(nèi)容,并且默認(rèn)編碼格式,防止出現(xiàn)亂碼
StreamReader reader = new StreamReader(fileName.FullName, System.Text.Encoding.Default);
string line = "";
string temp = "";
//循環(huán)讀取文本內(nèi)容
while ((line = reader.ReadLine()) != null)
{
temp += line;
}
reader.Close();
//返回字符串,用于lucene.net生成索引
return temp;
}
文本內(nèi)容已經(jīng)提取出來(lái)了,接下來(lái)要根據(jù)提取的內(nèi)容建立索引
protected void Button2_Click(object sender, EventArgs e)
{
//判斷存放文本的文件夾是否存在
if (!System.IO.Directory.Exists(filesDirectory))
{
Response.Write("<script>alert('指定的目錄不存在');</script>");
return;
}
//讀取文件夾內(nèi)容
DirectoryInfo dirInfo = new DirectoryInfo(filesDirectory);
FileInfo[] files = dirInfo.GetFiles("*.*");
//文件夾判空
if (files.Count() == 0)
{
Response.Write("<script>alert('Files目錄下沒(méi)有文件');</script>");
return;
}
//判斷存放索引的文件夾是否存在,不存在創(chuàng)建
if (!System.IO.Directory.Exists(indexDirectory))
{
System.IO.Directory.CreateDirectory(indexDirectory);
}
//創(chuàng)建索引
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];
//判斷文件格式,為以后其他文件格式做準(zhǔn)備
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));
//根據(jù)文本生成索引
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('索引創(chuàng)建成功');</script>");
}
3.索引創(chuàng)建完了,接下來(lái)就是搜索,搜索只要按照固定的格式書(shū)寫(xiě)不會(huì)出現(xiàn)錯(cuò)誤。
protected void Button1_Click(object sender, EventArgs e)
{
//獲取關(guān)鍵字
string keyword = TextBox1.Text.Trim();
int num = 10;
//關(guān)鍵字判空
if (string.IsNullOrEmpty(keyword))
{
Response.Write("<script>alert('請(qǐng)輸入要查找的關(guān)鍵字');</script>");
return;
}
IndexReader reader = null;
IndexSearcher searcher = null;
try
{
reader = IndexReader.Open(FSDirectory.Open(new DirectoryInfo(indexDirectory)), true);
searcher = new IndexSearcher(reader);
//創(chuàng)建查詢(xún)
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);
//根據(jù)關(guān)鍵字查詢(xún)
Query query = parser.Parse(keyword);
TopScoreDocCollector collector = TopScoreDocCollector.Create(num, true);
searcher.Search(query, collector);
//這里會(huì)根據(jù)權(quán)重排名查詢(xún)順序
var hits = collector.TopDocs().ScoreDocs;
int numTotalHits = collector.TotalHits;
//以后就可以對(duì)獲取到的collector數(shù)據(jù)進(jìn)行操作
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");
//在頁(yè)面循環(huán)輸出表格
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();
}
}
現(xiàn)在整個(gè)lucene.net搜索全文的過(guò)程就建立完了,現(xiàn)在可以搜索txt格式的文件,搜索其他格式的文件在以后添加,主要核心思想就是提取各個(gè)不同格式文件的文本內(nèi)容。
顯示效果如下:

在以后的博文里繼續(xù)接受搜索其他格式的文檔。
相關(guān)文章
微信公眾平臺(tái)開(kāi)發(fā)之發(fā)送圖文消息.Net代碼解析
這篇文章主要為大家詳細(xì)解析了微信公眾平臺(tái)開(kāi)發(fā)之發(fā)送圖文消息.Net代碼,感興趣的小伙伴們可以參考一下2016-06-06
.net開(kāi)發(fā)微信公眾平臺(tái)實(shí)例教程
這篇文章主要介紹了.net開(kāi)發(fā)微信公眾平臺(tái)的方法,對(duì)微信公眾平臺(tái)開(kāi)發(fā)的原理與相應(yīng)的.net實(shí)現(xiàn)方法都做了較為詳細(xì)的講述,非常實(shí)用,需要的朋友可以參考下2014-10-10
基于自定義Unity生存期模型PerCallContextLifeTimeManager的問(wèn)題
本篇文章小編將為大家介紹,基于自定義Unity生存期模型PerCallContextLifeTimeManager的問(wèn)題。需要的朋友參考下2013-04-04
asp.net動(dòng)態(tài)添加js文件調(diào)用到網(wǎng)頁(yè)的方法
這篇文章主要介紹了asp.net動(dòng)態(tài)添加js文件調(diào)用到網(wǎng)頁(yè)的方法,涉及asp.net動(dòng)態(tài)添加js的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
配置Spring.Net框架開(kāi)發(fā)環(huán)境
這篇文章介紹了配置Spring.Net框架開(kāi)發(fā)環(huán)境的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03
.net生成縮略圖及水印圖片時(shí)出現(xiàn)GDI+中發(fā)生一般性錯(cuò)誤解決方法
這篇文章主要介紹了.net生成縮略圖及水印圖片時(shí)出現(xiàn)GDI+中發(fā)生一般性錯(cuò)誤解決方法 ,需要的朋友可以參考下2014-11-11

