基於ASP.NET的lucene.net全文檢索搜尋實現步驟

來源:互聯網
上載者:User

在做項目的時候,需求添加全文檢索搜尋,選擇了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格式的檔案,搜尋其他格式的檔案在以後添加,主要核心思想就是提取各個不同格式檔案的常值內容。

顯示效果如下:

在以後的博文裡繼續接受搜尋其他格式的文檔。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.