Elasticsearch:使用过滤别名的替代方法

问题描述

我正在尝试解决以下问题的可能解决方案。在我当前的实现中,我依赖于所谓的过滤别名,在这里我可以为每个用户创建具有相同索引的视图,例如:

POST /aliases { "actions": "add": { "index": "events","alias": "events_123","filter": { "match": { "user_id": "123" } } } }

我所有的写/读api调用都使用别名而不是索引名。不幸的是,由于最近与由外部组件管理的每天索引模式的引入有关的更改,我不能再使用过滤的别名。是否有一种简单(或不太简单)的方法来提供我的user_id过滤器作为rest api调用的参数。例如,如果我有一个POST /events*/_search {...}请求,是否可以添加一个过滤器而无需修改搜索查询本身?

解决方法

您可以继续使用过滤的别名-index也可以包含通配符。不确定您的索引结构是什么样,但是类似的东西会起作用:

POST /aliases
{
  "actions": {
    "add": {
      "index": "events*","alias": "events_123","filter": {
        "match": {
          "user_id": "123"
        }
      }
    }
  }
}

如果您随着时间的推移不断添加索引,则需要通过索引模板(documentation)应用别名-例如Beats的操作方式:

PUT _template/events
{
  "index_patterns": ["events_*"],"aliases": {
    "events_123": {
      "filter": {
        "match": {
          "user_id": "123"
        }
      }
    }
  }
}

PS:您可以有一个别名列表,但是为了简化起见,我只添加了一个。