Lucene 是一个 .NET 全文搜索引擎库,其中包含强大的 API,用于创建全文索引并将高级和精确的搜索技术实施到您的程序中。 Lucene 提供的内容远远超出您对其他文本搜索引擎的期望,因为给用户的选择是多重的。 它具有强大的搜索算法,并支持广泛的搜索查询。
尽管 Lucene 本身就很强大,但它并非没有限制。 Lucene 在客户端应用程序中运行在进程内,Lucene 应用程序通常将数据写入文件并将其存储在磁盘上,从而导致巨大的内存分配。 但是,它是一个独立的解决方案,不会随着数据的增长而扩展,您需要重建整个 Lucene 索引来搜索数据,这是一项昂贵且缓慢的任务,可能会导致性能瓶颈。 这意味着 Lucene 不可扩展,并且存在单点故障。
NCache 更多信息 下载 NCache NCache 配套文档
分布式 Lucene 如何帮助您
NCache 提供 Lucene 的分布式实现,使 Lucene 应用程序可扩展。 NCache 使用 Lucene 进行自然分布提供了线性写入可扩展性,因为应用程序索引的文档会自动分布在缓存节点之间,并在其中单独索引。
同样,分布式 Lucene 还提供线性读取可扩展性,因为查询在每个分区上传播并合并结果。 更多数量的分区提供更高数量的读写可扩展性。 Lucene 索引保存在物理驱动器上。 节点越多,容纳大量 Lucene 文档和索引数据的可扩展性、性能和存储容量就越高。
NCache 更多信息 下载 NCache 分布式 Lucene 文档
分布式 Lucene 的工作原理
分布式 Lucene 包含多个服务器节点,每个服务器的 NCache 有一个专用的 Lucene 模块。 Lucene 和分布式 Lucene 的行为和工作方式是相似的,只是有一些变化。
下图显示了分布式 Lucene 模型的工作原理。
客户端应用程序可能希望使用 Lucene API 索引文档或查询现有的索引文档。 这些与 API 的交互就像客户端和服务器之间的远程过程调用 (RPC)。 API 调用直接转发到连接到每个服务器节点的 Lucene 模块。 Lucene 模块执行这些调用,根据调用的性质,会发生以下任一操作:
- 如果是查询调用,分布式 Lucene 模块会将结果返回到客户端,所有这些结果都会在客户端进行合并和处理。
- 如果调用索引文档,分布式 Lucene 模块会将该文档保存在磁盘驱动器上。
NCache 更多信息 分布式 Lucene 文档 分布式 Lucene 缓存
数据分布
生成分布图 NCache 分布式 Lucene 的集群。 此映射包含有关存储桶在缓存节点上的分布的信息。 这些桶(地图中存在 100 个桶)使用特定的策略分布在集群中。 从集群中添加或删除节点将更改分布图并触发正在运行的服务器节点的状态传输,这些节点在相应节点上传输带有索引数据的存储桶。
拥有 100 个桶意味着一个 Lucene 索引被分成 100 个子索引。 NCache 簇。 单个桶包含一个子索引,与 Lucene.Net 中的 Lucene 索引相同。 一个服务器节点可以包含多个索引,并且该服务器节点内的每个索引都包含根据集群的分布策略分配给它的桶。 索引内的数据通过这些桶均匀分布。
如何开始使用分布式 Lucene
分布式 Lucene 的工作方式与 Lucene 一样。 使用分布式 Lucene 的一大好处是它为您提供了与 Lucene. 作为 Lucene 用户,您可以通过单行代码更改的附加组件获得所需的可扩展性。 你只需要使用 NCache 目录和您的应用程序很好。 分布式 Lucene 中的行为和 API 更改很少,列在 文件.
让我们从技术方面仔细看看这些步骤,首要步骤是用分布式 Lucene Nuget 包替换您库中的 Lucene.NET Nuget 包 Lucene.Net。NCache.
连接到 NCache 目录
NCache 目录,顾名思义,是用于存储索引以使索引可扩展的基类。 所以,第一步是 与 NCache 目录.
下面给出的是将您连接到名为的缓存的代码 lucene缓存 并在所有服务器上打开提供的目录。
1 2 3 4 5 6 7 8 9 |
// Specify the cache name that is used for Lucene string cache = "LuceneCache"; // Specify the index name to create the indexes string indexName = "ProductIndex"; // Create a directory and open it on the cache and the index path NCacheDirectory ncacheDirectory = NCacheDirectory.Open(cache, indexName); |
NCache 更多信息 分布式 Lucene 地理空间 API 初始化分布式 Lucene
分布式 Lucene 中的索引数据
目录初始化后, IndexWriter
创建文档 使用与 Lucene.NET 中相同的机制在索引上使用 AddDocument
方法。 写文件的时候, IndexWriter.Commit
被调用来持久化文档并使其可搜索。
分布式 Lucene 允许您在同一目录中打开多个编写器以进行并行索引。 下面的代码示例演示了如何使用 Distributed Lucene 对文档进行索引。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// Create an instance of the writer IndexWriter indexWriter = new IndexWriter(ncacheDirectory, new IndexWriterConfig(LuceneVersion.LUCENE_48, new WhitespaceAnalyzer(LuceneVersion.LUCENE_48))); // Indexing // Add the products information that is to be indexed Product[] products = FetchProductsFromDB(); foreach (var prod in products) { // Create a document and add fields to it Document doc = new Document(); doc.Add(new TextField("ProductID", prod.ProductID, Field.Store.YES)); doc.Add(new TextField("ProductName", prod.ProductName, Field.Store.NO)); doc.Add(new TextField("Category", prod.Category, Field.Store.YES)); doc.Add(new TextField("Description", prod.Description, Field.Store.YES)); // Writer is created previously indexWriter.AddDocument(doc); } // Calling commit on the writer saves all the write operations indexWriter.Commit(); // Dispose the objects after indexing indexWriter?.Dispose(); ncacheDirectory?.Dispose(); |
NCache 更多信息 分布式 Lucene 方面 分布式 Lucene 索引
在分布式 Lucene 中搜索
搜索 可以在索引数据后执行。 这 IndexSearcher
使用 IndexReader
用于获取结果。 这 IndexSearcher
负责根据给定的查询搜索数据。 Lucene 提供了广泛的查询,分布式 Lucene 支持所有的 Lucene 查询。
下面的代码示例演示了如何使用 Distributed Lucene 搜索索引文档。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Open a new reader instance IndexReader reader = DirectoryReader.Open(ncacheDirectory); // A searcher is open to perform searching IndexSearcher indexSearcher = new IndexSearcher(reader); // Specify analyzer type Analyzer analyzer = new WhitespaceAnalyzer(version); // Create a query parser and parse the query with the parser //Specify the searchTerm and the fieldName QueryParser parser = new QueryParser(LuceneVersion.LUCENE_48, "Category", analyzer); Query query = parser.Parse("Beverages"); // Returns the top 10000 hits from the result set ScoreDoc[] docsFound = indexSearcher.Search(query, 10000).ScoreDocs; indexSearcher?.Dispose(); reader?.Dispose(); |
NCache 更多信息 分布式 Lucene 计数器 分布式 Lucene 搜索
将本机 Lucene 索引与分布式 Lucene 结合使用
如果您已经有一个使用 Lucene 的 .NET 应用程序,那么您可能已经构建了一个大型 Lucene 索引。 NCache 提供 进口LuceneIndex cmdlet,使用户能够将现有的 Lucene 索引导入 NCache 无需重建索引的分布式 Lucene。
此示例命令从以下位置加载本机 Lucene 索引 C:\索引 到分布式 Lucene 存储 演示缓存。
1 |
Import-LuceneIndex -CacheName demoCache -Path C:\Index -Server 20.200.21.11 |
NCache 更多信息 分布式 Lucene 文档 导入 Lucene 索引
结论
Lucene 是一个高效的搜索引擎,用于对您的数据执行全文搜索,但它缺乏可扩展性。 NCache 可以与 Lucene 一起使用,以使其轻松扩展。 可扩展的分布式 Lucene 不仅使您的应用程序更快,而且还帮助您处理单点故障的重大挫折。 NCache 可以通过单行代码更改轻松插入您的 .NET 应用程序,因此认为它是可扩展 Lucene 应用程序的最佳选择。