Elasticsearch 实现多租户系统的关键在于使用索引别名(Index Alias)和基于过滤器的查询(Filtered Query)。
首先,每个租户都有自己的索引,可以通过索引名称来区分。然后,为每个租户创建一个索引别名,这样就可以通过别名来访问租户的索引。例如,如果有两个租户,分别为 tenant1 和 tenant2,那么可以为它们创建如下别名:
PUT /tenant1_index
{
"aliases": {
"tenant1": {}
}
}
PUT /tenant2_index
{
"aliases": {
"tenant2": {}
}
}
接下来,在查询时可以使用基于过滤器的查询来限制只查询指定租户的数据。例如,对于上述的 tenant1 和 tenant2,可以使用如下查询:
GET /_search
{
"query": {
"filtered": {
"filter": {
"term": {
"tenant_id": "tenant1"
}
},
"query": {
"match": {
"title": "Elasticsearch"
}
}
}
}
}
上述查询中,通过过滤器限制了只查询 tenant_id 为 tenant1 的数据,然后在查询中搜索 title 包含 Elasticsearch 的文档。
使用索引别名和基于过滤器的查询,可以轻松地实现多租户系统,同时保证不同租户的数据互相隔离。