利用别名实现一个用户一个索引
为了保持设计的简洁,我们想让我们的应用认为我们为每个用户都有一个专门的索引——或者按照我们的例子每个论坛一个——尽管实际上我们用的是一个大的shared index。因此,我们需要一种方式将 routing
值及过滤器隐含于 forum_id
中。
索引别名可以帮你做到这些。当你将一个别名与一个索引关联起来,你可以指定一个过滤器和一个路由值:
PUT /forums/_alias/baking
{
"routing": "baking",
"filter": {
"term": {
"forum_id": "baking"
}
}
}
现在我们可以将 baking
别名视为一个单独的索引。索引至 baking
别名的文档会自动地应用我们自定义的路由值:
PUT /baking/post/1 (1)
{
"forum_id": "baking", (1)
"title": "Easy recipe for ginger nuts",
...
}
<1> 我们还是需要为过滤器指定 forumn_id
字段,但自定义路由值已经是隐含的了。
对 baking
别名上的查询只会在自定义路由值关联的分片上运行,并且结果也自动按照我们指定的过滤器进行了过滤:
GET /baking/post/_search
{
"query": {
"match": {
"title": "ginger nuts"
}
}
}
当对多个论坛进行搜索时可以指定多个别名:
GET /baking,recipes/post/_search (1)
{
"query": {
"match": {
"title": "ginger nuts"
}
}
}
<1> 两个 routing
的值都会应用,返回对结果会匹配任意一个过滤器。