方案對比
| 方案 | 特點 | 適用場景 | 學習成本 |
| Lucene.NET | 嵌入式、無獨立進程、API 豐富 | 中小型應用、單機部署 | 中 |
| Elasticsearch | 分布式、RESTful、近實時、生態強 | 大規模、高併發、多語言 | 較高 |
| SQL Server Full-Text Search | 內建、無額外組件、T-SQL 集成 | 簡單全文檢索、已用 SQL Server | 低 |
| PostgreSQL pg_trgm / tsvector | 內建、支持模糊/正則 | PostgreSQL 用戶 | 低 |
| MeiliSearch / Typesense | 輕量、開箱即用、類 Algolia | 中小型、追求開發體驗 | 低 |
快速上手:Lucene.NET 4.8 (NuGet)
// 1. 索引寫入
var dir = FSDirectory.Open(new DirectoryInfo("LuceneIndex"));
var analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48);
var config = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);
using (var writer = new IndexWriter(dir, config)) {
var doc = new Document();
doc.Add(new TextField("id", "1", Field.Store.YES));
doc.Add(new TextField("title", "C# 高級編程", Field.Store.YES));
doc.Add(new TextField("content", "第1章 介紹...", Field.Store.NO));
writer.AddDocument(doc);
writer.Commit();
}
// 2. 搜索
using (var reader = DirectoryReader.Open(dir))
using (var searcher = new IndexSearcher(reader)) {
var parser = new MultiFieldQueryParser(LuceneVersion.LUCENE_48,
new[] { "title", "content" }, analyzer);
var query = parser.Parse("C# 編程");
var hits = searcher.Search(query, 10).ScoreDocs;
foreach (var hit in hits) {
var doc = searcher.Doc(hit.Doc);
Console.WriteLine($"{doc.Get("id")} {doc.Get("title")} Score:{hit.Score}");
}
}
資源鏈接
選型建議
- **新項目、預期數據增長快** → 直接上 Elasticsearch (Docker 一鍵啟動)。
- **現有 SQL Server、檢索需求簡單** → 開啟 Full-Text Search,最省事。
- **單機、不想維護中間件** → Lucene.NET 或 MeiliSearch。