分布式 Lucene 概述
NCache 提供了一个 Lucene 模块,它允许您使用 Lucene 进行文本搜索 NCache. 每台服务器 NCache 有一个专用的 Lucene 模块。 这使得 Lucene 具有分布式、可扩展性和高可用性 NCache.
备注
此功能可用于 NCache 企业 和 做强做精做久。 等加工。为 分区拓扑 只。
备注
NCache 使用Lucene.Net 4.8版本。
为什么要使用 Lucene NCache?
正如我们所知,Lucene 是一个强大而高效的搜索引擎,它提供了大量的文本搜索技术来满足您的业务需求。 Lucene 比任何其他文本搜索引擎都要强大得多,因为给予用户的选择是多种的。 它具有强大的搜索算法,支持广泛的搜索查询。
尽管 Lucene 本身功能强大,但它也有其局限性。 Lucene 在客户端应用程序中在进程内运行。 这意味着 Lucene 不可扩展,并且存在单点故障。
NCache 提供 Lucene 的分布式实现,其 API 稍作更改。 Lucene 的 API 调用 NCache 在后端。 NCache 使用 Lucene 进行自然分布提供了线性写入可扩展性,因为应用程序索引的文档会自动分布在缓存节点之间,并在其中单独索引。
备注
分布式 Lucene 使用单独的专用 Lucene 存储,而不是 NCache 缓存存储。
类似地,分布式 Lucene 还提供线性读取可扩展性,因为查询在每个分区上传播并合并结果。 分区数量越多,读写可扩展性就越高。 Lucene 索引持久保存在您的物理驱动器上。 节点越多,可扩展性、性能和存储容量就越高,以容纳大量 Lucene 文档和索引数据。
分布式Lucene的工作
重要
强烈建议您使用 SSD 而不是 HDD 来索引和搜索 Lucene 文档。
Lucene 和分布式 Lucene 的行为和工作几乎相同,只有一些变化。 分布式 Lucene 的工作流程、数据分布和组件将在以下部分中解释:
分布式 Lucene 工作流程
下图显示了分布式 Lucene 模型的工作原理。
客户端应用程序可能想要索引和分析(由支持的 Lucene 分析器分析)文档或使用 Lucene API 查询现有索引文档。 这些使用 API 的操作就像远程过程调用 (RPC) 一样,直接转发到 NCache 簇。 集群确定这些调用的性质,并将调用转发到连接到每个服务器节点的分布式 Lucene 模块。 这些模块执行这些调用,并根据调用的性质,发生以下任一操作:
查询文档调用: 如果是查询调用,分布式 Lucene 模块会将结果返回到客户端,所有这些结果将在客户端进行合并和处理。
索引文件调用: 如果是对文档进行索引的调用,分布式 Lucene 模块会将该文档保留在磁盘驱动器上。
数据分布
针对缓存集群生成分布图。 对于分布式 Lucene,生成此映射:
- 关于缓存创建。
- 在添加或删除服务器节点时。
警告
如果分布图不存在,缓存将无法启动,并且异常情况将记录在事件查看器和服务日志中。
此映射包含有关针对缓存节点的存储桶的信息。 分布式 Lucene 缓存的存储桶总数为 100。这 100 个存储桶使用特定策略分布在集群中。
拥有 100 个存储桶意味着一个索引在整个缓存集群中被拆分为 100 个子索引。 根据分配给每个节点的存储桶数量,所有相应的索引文件也会移动到该特定节点。 因此,每当状态传输导致存储桶在缓存集群中移动时,相应的索引文件也会作为该过程的一部分移动。
一个服务器节点可以包含多个索引,该服务器节点内的每个索引都包含根据集群的分布策略分配给它的存储桶。 针对索引的文档通过这些存储桶均匀分布。 这些索引也保留在您的物理驱动器上。
NCache 具有运行时或动态分布。 节点启动或停止会触发缓存集群分布图的变化,触发状态转移。 然而,在 NCache 分布式Lucene,索引持久保存在物理驱动器上,以避免在节点启动或停止时不必要的索引分布。 意思是说,在 NCache 分布式 Lucene,只有从缓存集群中添加或删除一个节点,才会改变分布图并触发正在运行的服务器节点的状态传输。 对于停止的服务器节点,一旦它们重新上线,就会进行状态转移。
以下是一些需要考虑的要点 NCache 分布式Lucene:
- 缓存分布图: 仅当缓存创建成功时,才会生成新缓存的分布图。 如果分布图生成由于某种原因失败,缓存创建会回滚(恢复)。
- 状态转移: 缓存集群成员配置的任何更改都会导致分布图的更改,因为这将触发缓存集群中的状态转移。
- 向现有集群添加节点: 在这种情况下,所有服务器节点(甚至是正在添加的节点)都应该在物理上可用,并且它们的服务应该正在运行。 将节点添加到分布式 Lucene 缓存集群时,将从现有服务器节点获取现有分布图。 然后生成一个新的分布图并与所有服务器节点共享。 发送一个提交调用来持久化这个分布图。
- 从现有集群中删除节点: 在这种情况下,与添加到现有集群的节点类似,所有服务器节点(被删除的节点除外)都应该在物理上可用,并且它们的服务应该正在运行。 否则,此操作将失败。
- 状态转移期间节点关闭: 如果服务器节点在状态传输期间关闭,则该节点的状态传输将停止,并在该节点再次启动时从同一存储桶(节点关闭的位置)恢复。
重要
在开发者安装的情况下,商店可以配置分布式Lucene。
初始化分布式 Lucene
在开始使用分布式 Lucene 索引文档并随后搜索它们之前,您需要 初始化 首先。 初始化后,您需要提供缓存名称和索引名称。
索引数据
分布式 Lucene 中的索引过程与 Lucene 本身相同。 对于分布式 Lucene 来说, NCache 维护一个用于文档分发的键值存储,并将自动生成的键添加到每个文档中。 该文档根据该特定键在节点上建立索引。
索引搜索
一旦分布式 Lucene 被初始化并且您的文档已经被索引,您就可以对这些文档执行基于文本的搜索。
面
类别是索引文档的一个重要方面,用于对其进行分类。 例如,在电商商店搜索衣服时,衣服的类别可以是价格、材质、品牌等。
在分面搜索中,除了正常的搜索结果之外,您还会获得分面结果,其中包含某些类别的子类别。 继续上面的例子,材质方面的子类别可以是棉、羊毛、皮革等。
分面搜索使您可以轻松搜索所需的特定文档。 NCache 现在支持带有分布式 Lucene 的 Facets,这将帮助您高效且有效地处理所需的文档。 Lucene 和分布式 Lucene 中切面的工作原理基本相同,但有许多性能增强,这些增强在 分布式 Lucene 方面.
地理空间 API
包含经度和纬度坐标值的数据称为 地理空间数据。 如果您想根据数据的位置搜索数据,此数据非常有用。 例如,您想要对包含餐馆信息的文档建立索引。 该文档包含各种字段,其中一个字段包含经度和纬度值。 将来要根据位置(假设离您最近的餐厅)搜索该文档,您还需要对经度和纬度字段建立索引。
Lucene 有一个非常强大的地理空间数据索引和搜索功能,现在 NCache 还允许您使用 Lucene API 对文档建立索引并根据其位置进行搜索。 以下链接将帮助您了解如何索引数据并搜索数据 分布式 Lucene 地理空间 API 部分。
部分集群中的分布式 Lucene 行为
当缓存集群中的一个或多个节点变得不可用时,该缓存集群将被声明为部分缓存集群。 因此,连接性受到限制,使得缓存集群成为部分集群。 分布式 Lucene 在部分集群中的行为解释如下:
部分集群的读操作
NCache 分布式 Lucene 允许您通过设置 AllowPartialResults
财产 TRUE
在 IndexReader
类实例。 默认情况下, AllowPartialResults
标志设置为 FALSE
.
这些读取操作将返回部分或不完整的数据。 然而,在以下情况下 分区副本拓扑,缓存集群将通过其副本容忍单个节点故障,并且您将能够检索完整数据。 但是,如果出现多个节点故障,您将只能检索部分数据。
警告
如果您尝试从部分集群中读取数据并且您设置了 AllowPartialResults
标记为 FALSE
, 会抛出异常。
部分集群上的写操作
分布式 Lucene 不允许您在部分集群上执行写入操作,例如添加、更新和删除。 如果您尝试在部分集群上执行这些操作,则会引发异常。
不支持的 Lucene API
下面给出了分布式 Lucene 不支持的 Lucene API 列表。
DirectoryReader
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexCommit commit)
public static DirectoryReader OpenIfChanged(DirectoryReader oldReader, IndexWriter writer, bool applyAllDeletes)
IndexSearcher
public IndexSearcher(IndexReaderContext context, TaskScheduler executor)
public Document Document(int docID, ISet<string> fieldsToLoad)
public virtual Weight CreateNormalizedWeight(Query query)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, int n, Sort sort)
public virtual TopDocs SearchAfter(ScoreDoc after, Query query, Filter filter, int n, Sort sort, bool doDocScores, bool doMaxScore)
IndexReader
public static DirectoryReader Open(Directory directory)
public static DirectoryReader Open(Directory directory, int termInfosIndexDivisor)
public static DirectoryReader Open(IndexWriter writer, bool applyAllDeletes)
public static DirectoryReader Open(IndexCommit commit)
public static DirectoryReader Open(IndexCommit commit, int termInfosIndexDivisor)
public IList<AtomicReaderContext> Leaves
NCacheDirectory
public override string[] ListAll()
public override long FileLength(string name)
public override void DeleteFile(string name)
public override string GetLockID()
public override IndexInput OpenInput(string name, IOContext context)
CompositeReader
public override sealed IndexReaderContext Context
更多资讯
NCache 提供了分布式 Lucene 的示例应用程序 GitHub上.