利用别名实现一个用户一个索引 (Faking Index per User with Aliases)edit

为了保持设计的简洁,我们想让我们的应用认为我们为每个用户都有一个专门的索引 —— 或者例子中的每个论坛一个 —— 尽管实际上我们用的是一个大的共享索引(shared index)。 因此,我们需要一种方式将 routing 值及过滤器隐含于 forum_id 中。

索引别名允许我们这样做。当你将一个别名与一个索引关联时,可以指定一个过滤器和一个路由值:

PUT /forums/_alias/baking
{
  "routing": "baking",
  "filter": {
    "term": {
      "forum_id": "baking"
    }
  }
}

现在我们可以将别名baking视为一个单独的索引。索引至别名baking的文档会自动地应用我们自定义的路由值:

PUT /baking/post/1 
{
  "forum_id": "baking", 
  "title":    "Easy recipe for ginger nuts",
  ...
}

我们还是需要为过滤器指定 forumn_id 字段,但自定义路由值已经是隐含的了。

对别名baking的查询只会在自定义路由关联的分片上运行,并且结果也自动按照我们指定的过滤器进行了过滤:

GET /baking/post/_search
{
  "query": {
    "match": {
      "title": "ginger nuts"
    }
  }
}

当对多个论坛进行搜索时可以指定多个别名:

GET /baking,recipes/post/_search 
{
  "query": {
    "match": {
      "title": "ginger nuts"
    }
  }
}

两个 routing 的值都会应用,结果会匹配任意一个过滤器。