平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“三大.NET全文搜索框架(Lucene.NET, Elasticsear……”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
落到代码里,Lucene.NET、Elasticsearch for .NET 和 Solr for .NET 是 .NET 开发中采用的三个重要的全文搜索解决方案。以下是它们的优势和缺点的分析以及一些C#示例,帮助你在项目里披荆斩棘。
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Lucene.Net.Documents;
using Lucene.Net.Util;
public class LuceneExample
{
private static readonly string indexPath = "C:\LuceneIndex";
public static void CreateIndex()
{
using var directory = FSDirectory.Open(indexPath);
var analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48);
var indexConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);
using var writer = new IndexWriter(directory, indexConfig);
var doc = new Document
{
new TextField("title", "Lucene for .NET", Field.Store.YES),
new TextField("content", "Lucene is a search library for .NET.", Field.Store.YES)
};
writer.AddDocument(doc);
writer.Flush(triggerMerge: false, applyAllDeletes: false);
}
public static void SearchIndex(string queryText)
{
using var directory = FSDirectory.Open(indexPath);
using var reader = DirectoryReader.Open(directory);
var searcher = new IndexSearcher(reader);
var analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48);
var queryParser = new QueryParser(LuceneVersion.LUCENE_48, "content", analyzer);
var query = queryParser.Parse(queryText);
var hits = searcher.Search(query, 10).ScoreDocs;
foreach (var hit in hits)
{
var foundDoc = searcher.Doc(hit.Doc);
Console.WriteLine($"Found: {foundDoc.Get("title")}");
}
}
}
using Nest;
public class ElasticsearchExample
{
private static readonly Uri node = new Uri("http://localhost:9200");
private static readonly ConnectionSettings settings = new ConnectionSettings(node).DefaultIndex("documents");
private static readonly ElasticClient client = new ElasticClient(settings);
public static void IndexDocument()
{
var document = new
{
Id = 1,
Title = "Elasticsearch for .NET",
Content = "Elasticsearch is a distributed search engine."
};
var indexResponse = client.IndexDocument(document);
Console.WriteLine($"Index Success: {indexResponse.IsValid}");
}
public static void SearchDocument(string queryText)
{
var searchResponse = client.Search<dynamic>(s => s
.Query(q => q
.Match(m => m
.Field(f => f.Content)
.Query(queryText)
)
)
);
foreach (var hit in searchResponse.Hits)
{
Console.WriteLine($"Found: {hit.Source.Title}");
}
}
}
能够借助 SolrNet 这个 .NET 库与 Solr 进行交互。
using SolrNet;
using SolrNet.Commands.Parameters;
public class SolrExample
{
private static readonly ISolrOperations<Product> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>();
public static void IndexDocument()
{
var product = new Product
{
Id = "1",
Title = "Solr for .NET",
Description = "Solr is a powerful search platform."
};
solr.Add(product);
solr.Commit();
}
public static void SearchDocument(string queryText)
{
var results = solr.Query(new SolrQueryByField("description", queryText), new QueryOptions
{
Rows = 10
});
foreach (var result in results)
{
Console.WriteLine($"Found: {result.Title}");
}
}
}
public class Product
{
public string Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
}
这三者各有优势,具体选择取决于项目规模、搜索需求和扩展性要求。
在这个场景下,以上就是三大.NET全文搜索框架(Lucene.NET, Elasticsearch, Solr)的实战指南与性能分析的详细内容,更多关于.NET全文搜索框架的资料请关注脚本之家其它相关文章!