Meilisearch v1.14 发布啦 ✨ 在我们的博客上阅读更多内容

返回主页Meilisearch 的标志
返回文章
2023 年 7 月 27 日

多租户指南

了解如何在多租户应用程序中使用 Meilisearch

Carolina Ferreira
Carolina Ferreira开发者倡导者 @ Meilisearch@CarolainFG
Multi-tenancy guide

今天,我们将深入探讨一个复杂但至关重要的主题:在多租户应用程序中利用 Meilisearch。通过本指南,高级和中级开发者将清楚地了解如何配置 Meilisearch 以有效地管理多租户。

多租户:它是什么?

在多租户架构中,单个软件应用程序实例为多个客户或“租户”提供服务。每个租户的数据都是隔离的,并且对其他租户不可见。

多租户用例

多租户的典型用例是在 软件即服务 (SaaS) 应用程序中,其中多家公司共享同一个数据库。每家公司都成为一个租户,其数据不应被其他人访问。在这种情况下,您可能已经在主数据存储中实现了这种特殊性。

Meilisearch 的多租户:最终方法

虽然可以使用 Meilisearch 为每个公司创建一个索引,但不建议这样做,因为性能原因。Meilisearch 逐个索引处理任务,并且无法最大化索引吞吐量,因为它无法并行处理不同索引上的任务。

相反,最好的方法是将所有租户放在同一个索引中,并使用 Meilisearch 强大的租户令牌来仅限制对特定用户范围的访问。为此,存储的文档不仅应具有ID,还应具有公司标识符,以按公司分隔用户。

通过我们的演示体验多租户的实际应用
- SaaS 演示
- 租户令牌演示

为多租户准备 Meilisearch

让我们用一个类似于 Slack 应用程序的例子来说明这一点。在此应用程序中,用户属于一家公司,每个用户都可以在不同的线程中创建文本消息。我们的目标是创建一个包含所有消息的索引,但只允许来自特定公司的人员访问其公司的消息。随后,我们可能希望执行搜索,应用关于用户和线程的过滤器

Database diagram showing the relationships between companies, users, and messages.

首先,我们需要转换我们的数据,使其最适合 Meilisearch 索引。以下是一个示例文档的样子

{
	"id": 48735873,
	"user":{
		"id": 5749,
		"name": "bob"
	},
	"company": {
		"id": 838,
		"name": "Acme Inc"
	},
	"thread": "meilisearch-is-awesome",
	"data": "Meilisearch is so easy to use! 🔥",
	"created_at": 1543230000
}

了解如何在文档中更新您的设置

接下来,您需要创建一个消息索引并添加以下设置

{
  "displayedAttributes": [
    "id",
		"user.name",
		"thread",
		"data",
		"created_at"
  ],
  "searchableAttributes": [
    "data"
  ],
  "filterableAttributes": [
		"user.name",
		"company.id",
		"thread"
	],
  "sortableAttributes": [
		"created_at"
	]
}

以下是每个设置的作用

  • displayedAttributes:这些是将在您的应用程序搜索结果中显示的属性。出于安全原因,我们省略了 user.idcompany.id,并且 company.name 不是必需的,因为用户已经知道他们所属的公司。
  • searchableAttributes:这些是搜索功能将使用的属性。在我们的例子中,只有 data(或消息文本)是可搜索的。
  • filterableAttributes:这些是您可以用来过滤的属性。我们包含了用于租户令牌的 company.iduser.name 和用于即时过滤的 thread
  • sortableAttributes:这些是您可以用来排序的属性。我们只包含了 created_at,因为您可能希望按时间顺序对消息进行排序。

创建租户令牌

在 Meilisearch 配置到位后,下一步是为每个公司创建一个新的租户令牌。如果您没有特定的安全问题,您可以省略到期日期以简化您的入职流程。

租户令牌的关键部分是 searchRules。在我们的示例中,您将添加以下规则

{
  "messages": {
    "filter": "company.id = 838"
  }
}

使用生成的令牌,您的搜索将根据 company.id 限制访问,因此用户将只能看到他们公司内的消息。

将此令牌存储在您的主数据存储(Postgres、MySQL 等)中。这种机制类似于 Stripe 等工具中使用的机制。

每次用户登录您的应用程序时,将此密钥加载到本地存储并将其用于搜索,以确保每个用户只能访问与其公司相关的数据。

结论

一旦您了解如何正确地构建数据和配置搜索属性,使用 Meilisearch 创建多租户应用程序 就非常简单了。通过遵循本指南,您可以确保您的应用程序提供安全、高效且用户友好的搜索体验。如果您有任何问题,可以加入我们的 Discord

使用 Meilisearch Cloud 提高生产力并简化开发。不再需要服务器部署或手动更新。免费试用 14 天,无需信用卡。

要了解更多关于 Meilisearch 的信息,请订阅我们的新闻通讯。您可以通过查看我们的路线图并参与我们的产品讨论来了解更多关于我们产品的信息。

编码愉快!

Meilisearch indexes embeddings 7x faster with binary quantization

Meilisearch 使用二进制量化将嵌入向量的索引速度提高 7 倍

通过使用向量存储库 Arroy 实现二进制量化,在保持搜索相关性和效率的同时,大幅减少了大型嵌入向量的磁盘空间使用量和索引时间。

Tamo
Tamo2024 年 11 月 29 日
How to add AI-powered search to a React app

如何在 React 应用程序中添加 AI 驱动的搜索

使用 Meilisearch 的 AI 驱动搜索构建一个 React 电影搜索和推荐应用程序。

Carolina Ferreira
Carolina Ferreira2024 年 9 月 24 日
Meilisearch is too slow

Meilisearch 速度太慢

在这篇博文中,我们探讨了 Meilisearch 文档索引器所需的增强功能。我们将讨论当前的索引引擎、其缺点以及优化性能的新技术。

Clément Renault
Clément Renault2024 年 8 月 20 日