首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

Lucene.NET 全文搜尋實作指南:從建立索引到多欄位查詢

     編輯:ASP.NET 基礎

架構概覽

Lucene.NET 是 Java Lucene 的 C# 移植版,核心流程:

  1. 索引建立:文件 → 提取文字 → 分析器斷詞 → 倒排索引寫入目錄。
  2. 搜尋查詢:關鍵字 → 解析器生成 Query → 搜尋器檢索索引 → 評分排序 → 回傳文件。

環境準備

Install-Package Lucene.Net
// 相容 .NET Framework 4.x / .NET Standard 2.0

索引建立完整範例

// 設定路徑
string dataDir = Server.MapPath("~/App_Data/Docs");      // 原始 .txt/.xml 檔案
string indexDir = Server.MapPath("~/App_Data/LuceneIndex"); // 索引目錄

// 1. 確保目錄存在
if (!Directory.Exists(indexDir)) Directory.CreateDirectory(indexDir);

// 2. 分析器 (中文建議 PanGu 或 JiebaNet,此處用 StandardAnalyzer 演示)
var analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(LuceneVersion.LUCENE_48);

// 3. 開啟索引寫入器
using (var dir = FSDirectory.Open(indexDir))
using (var writer = new IndexWriter(dir, new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer)))
{
    var files = new DirectoryInfo(dataDir).GetFiles("*.txt"); // 簡單篩選
    foreach (var file in files)
    {
        string content = File.ReadAllText(file.FullName, Encoding.Default); // 依實際編碼

        var doc = new Document();
        doc.Add(new TextField("FileName", file.Name, Field.Store.YES));
        doc.Add(new TextField("Content", content, Field.Store.YES));
        doc.Add(new StringField("Path", file.FullName, Field.Store.YES)); // 不分詞

        writer.AddDocument(doc);
    }
    writer.Commit(); // 或 writer.Flush(triggerMerge: true, applyAllDeletes: true);
}

搜尋查詢完整範例

string keyword = txtKeyword.Text.Trim();
if (string.IsNullOrEmpty(keyword)) return;

using (var dir = FSDirectory.Open(indexDir))
using (var reader = DirectoryReader.Open(dir))
{
    var searcher = new IndexSearcher(reader);

    // 多欄位查詢解析器
    var parser = new MultiFieldQueryParser(LuceneVersion.LUCENE_48,
        new[] { "FileName", "Content" }, analyzer);
    var query = parser.Parse(keyword);

    // 收集前 10 筆最高分
    var collector = TopScoreDocCollector.Create(10, true);
    searcher.Search(query, collector);

    var hits = collector.TopDocs.ScoreDocs;
    var sb = new StringBuilder();
    sb.Append("<table><tr><th>檔名</th><th>片段</th></tr>");

    foreach (var hit in hits)
    {
        var doc = searcher.Doc(hit.Doc);
        string name = doc.Get("FileName");
        string content = doc.Get("Content");
        string snippet = content.Length > 200 ? content.Substring(0, 200) + "..." : content;

        sb.Append($"<tr><td>{name}</td><td>{snippet}</td></tr>");
    }
    sb.Append("</table>");
    litResults.Text = sb.ToString();
}

關鍵類別對照表

Java LuceneLucene.NET說明
IndexWriterIndexWriter建立/更新索引
IndexReaderDirectoryReader唯讀索引讀取
IndexSearcherIndexSearcher執行搜尋
QueryParserQueryParser / MultiFieldQueryParser字串解析為 Query
AnalyzerAnalyzer斷詞/過濾 (Standard, PanGu, Jieba)
DocumentDocument索引單位 (含多 Field)
FieldField / TextField / StringField欄位類型 (分詞/不分詞/儲存)

中文分詞建議

  • PanGu.Segment:成熟、詞庫豐富、支援自定義詞典。
  • JiebaNet:結巴分詞 .NET 移植、速度快、支援 HMM/詞性標註。
  • 使用時替換 analyzer 為對應實作即可,索引與查詢**必須使用同一 Analyzer**。

效能優化提示

  • 索引優化:定期呼叫 writer.ForceMerge(1) 合併段檔 (離線/低峰執行)。
  • 搜尋快取:QueryCache、FilterCache 重複查詢加速。
  • 非同步索引:寫入佇列 + 背景工作線程批次 Commit,避免阻塞 Web 請求。
  • 欄位選擇:StringField (不分詞、精確匹配) 用於 ID、路徑、標籤;TextField 用於全文內容。

結語

Lucene.NET 提供工業級全文搜尋能力,**核心在於「分析器選擇」與「索引維護策略」**。掌握 IndexWriter 建立索引、MultiFieldQueryParser 多欄位查詢、TopScoreDocCollector 分頁排序三大招式,即可在 ASP.NET 專案快速落地搜尋功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved