我们正在致力于无头的应用程序设计和开发。当前,我们面临的是**architectural question**
,我们需要找到答案才能继续进行系统设计,我们不是**search engine**
的专家,但是我们正在这一 Realm 进行研究。
我们的技术stack is .net Core/SQL Server
,将来我们可能会plan to use Raven DB.
我们计划不使用内容交付API,而是计划使用Query based content delivery
使其更灵活并减少每个前端框架的API开发开销。我们决定将索引和索引用于大多数数据管理,即减少数据库负载。因此,基本上大多数内容操作都将使用索引进行处理。
我们在搜索引擎中观察到的问题:
首先,我们计划使用Elastic Search
,但再次了解以下issues
。
系统将具有dynamic field management and field data management
,即用户将在系统运行时编辑字段和字段值。每次我们可能需要重建索引以更新 flex 搜索中的字段(我们不是搜索引擎专家)时,这都会增加网络负载,这对于我们在大型 Multi-Tenancy 环境中运行可能不可行。
因此,我们使用decided to go with Lucene.net
,但是在继续进行lucene.net
之前,我们要确保可以解决以下问题。
动态更新字段而无需每次都重新建立索引,lucene是否支持此功能,或者我们可以自定义管理此功能?
第二个问题是使用分布式体系结构为每个租户管理单独的索引。
我们计划为生产中的每个租户分配一个分区,以使数据不会在单个索引中。这是因为我们不需要在Web服务器上增加高负荷来管理基于权限的查询结果,而是Lucene会这样做。因此,对于任何查询结果,都是根据查询用户的权限返回的,因此最好为每个租户都使用单独的索引以减少操作。
是否可以通过为每个租户专门分配一个分区来分发Lucene实现?
因此,请为我们目前面临的上述两个问题找到解决方案。
最佳答案
Elasticsearch在内部仅使用Lucene,每个Elasticsearch索引(由一个或多个碎片组成)在内部都是Lucene索引。 您甚至可以将Elasticsearch视为分布式Lucene ,可以轻松地将其扩展到数千个物理服务器。
现在,这应该清除您所有的疑问,因为所有低级操作(例如更新文档和删除文档)都是由内部Lucene完成的,以防Elasticsearch是问题的第1部分。
您的第一个问题
问:动态更新字段而无需每次都重新建立索引,Lucene是否支持此功能,或者我们可以自定义管理此功能?
您正在更新单个文档,不会导致整个索引重建,并且您将在1秒内获得更新的文档(默认为refresh interval),或者如果要立即更新文档,则可以进行显式刷新(不推荐)。
您的第二个问题:
问:是否可以通过为每个租户专门分配一个分区来分发Lucene实现?
回答:如前所述,您可以将Elasticsearch仅视为分布式Lucence,并且可以轻松地为每个租户创建一个单独的索引,并且它们不会与其他数据交互(尽管如果您在同一个Elasticsearch集群上存储多个索引,则会而不是红外线资源隔离(CPU,内存)等),您可能会遇到嘈杂的邻居问题。