Azure 认知搜索能否用作某些数据的主数据库?

Can Azure Cognitive Search be used as a primary database for some data?

Microsoft 将 Azure Search 宣传为“云搜索”,但不一定说它是“数据库”或“数据存储”。它并没有说它是大数据。

Can/should Azure Search 可以用作某些数据的主数据库吗?还是应该始终有一些“主要”数据存储在 Azure 搜索中“复制”以用于搜索目的?

如果是,在什么circumstances/what 场景下使用 Azure 搜索作为主数据库有意义?

虽然我们通常不推荐它,但如果出现以下情况,您可以考虑将 Azure 搜索用作主要存储:

  1. 您的应用可以容忍一些数据不一致。Azure 搜索最终是一致的。
    • 索引数据后,无法立即查询。
    • 目前没有机制可以控制对索引中同一文档的并发更新。
    • 使用搜索查询读取数据时,分页不基于任何类型的快照,因此您可能会丢失或重复文档。
  2. 您不需要读出索引的全部内容。 Azure 搜索中的分页依赖于 $skip 参数,该参数目前上限为 100000。对于大于 100000 个文档的索引,读取所有数据可能非常棘手。您需要选择一些字段进行分区,并且您的读取没有一致性保证。
  3. 万一意外删除,您可以丢失数据。截至撰写本文时,Azure 搜索不支持 backup/restore。如果您不小心删除了数据,则需要从其原始来源重新编制索引。
  4. 您不需要对索引定义做太多更改。从索引中修改或删除字段目前需要重新索引所有数据(您可以添加新字段而无需重新-索引)。如果 Azure 搜索是你的主要存储,你唯一的选择可能是尝试将旧索引中的所有数据读取到新索引中,这受到上述关于一致性、$skip 等的所有限制
  5. 您的应用程序的查询需要与 Azure 搜索提供的功能相匹配。Azure 搜索支持全文搜索、构面和 OData 筛选语言的子集,但它不支持支持诸如索引之间的连接或任意聚合之类的事情。如果你的应用程序需要不同于 Azure 搜索提供的查询功能,你应该考虑另一个 NoSQL 解决方案,如 Azure Cosmos DB。
  6. 您的应用程序可以容忍高写入延迟。由于它是一个搜索引擎而不是通用数据库,因此 Azure 搜索针对查询性能(尤其是全文搜索查询)。这是以较慢的写入性能为代价的,因为每次写入都需要大量工作来索引数据。特别是,通过将索引操作一起批处理(批处理最多可包含 1000 个索引操作),您将获得最佳写入吞吐量。一次将一个文档写入索引会导致吞吐量大大降低。

请注意,出于可管理性和易用性的考虑,其中许多是我们希望在未来改进 Azure 搜索的领域,但让 Azure 搜索成为通用的 NoSQL 数据库从来都不是我们的目标。