选择正确的搜索和索引解决方案

Choosing the Right Solution for Search and Indexing

我们正在致力于无头应用程序的设计和开发。目前,我们正面临一个**architectural question**问题,我们需要找到答案才能继续设计系统,我们不是**search engine**方面的专家,但我们正在研究这方面的问题。

我们的技术 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,即用户将在系统处于 运行 时编辑字段和字段值。因为每次我们可能需要重建索引来更新弹性搜索中的字段(我们不是搜索引擎专家),这会增加网络负载,这对于我们在大型多租户环境中运行可能不可行。

所以我们 decided to go with Lucene.net,但在继续 lucene.net 之前,我们要确保可以解决以下问题。

动态更新字段而无需每次都重建索引,lucene 是否支持这个,或者我们可以自定义来管理这个吗?

第二个问题是使用分布式架构为每个租户管理单独的索引。

我们计划为生产环境中的每个租户创建一个分区,这样数据就不会位于单个索引中。这是因为我们不需要在 Web 服务器上施加高负载来管理基于权限的查询结果,而 Lucene 会这样做。所以对于任何查询结果都会根据查询用户的权限返回,所以最好为每个租户都有单独的索引以减少操作。

是否可以通过为每个租户独占一个分区来实现分布式 Lucene 实现?

所以请帮助找到我们现在面临的上述两个问题的解决方案。

Elasticsearch 内部仅使用 Lucene,每个 elasticsearch 索引(由一个或多个分片组成)在内部都是一个 Lucene 索引。 您甚至可以将 Elasticsearch 视为分布式 Lucene,可以轻松扩展到数千台物理服务器。

现在,这应该消除了您的任何疑问,因为在 Elasticsearch 的情况下,所有低级操作(例如更新文档和删除文档)都是由内部 Lucene 完成的,这是您问题的第 1 部分。

你的第一个问题

问:动态更新字段,不用每次都重建索引,Lucene是否支持这个,或者我们可以自定义管理这个吗?

您只是更新单个文档,它不会导致整个索引重建,您将在 1 秒内获得更新的文档(默认 refresh interval)或者如果您想要更新立即记录您可以进行显式刷新(不推荐)。

第二个问题:

问:是否可以通过为每个租户独占一个分区来实现分布式 Lucene 实现?

回答:正如所解释的,您可以将 Elasticsearch 仅视为分布式 Lucence,并且可以轻松地为每个租户创建单独的索引,并且它们不会相互连接数据(尽管如果您将多个索引存储在同一个 Elasticsearch 集群不会有基础资源隔离(CPU,内存))等,你会遇到嘈杂的邻居问题。