【问题标题】:Elasticsearch: Alternative to using filtered aliasesElasticsearch:使用过滤别名的替代方法
【发布时间】:2023-03-08 00:41:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: elasticsearch amazon-elasticsearch


    【解决方案1】:

    您可以继续使用过滤别名 - 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:你可以有一个别名列表,但为了简单起见,我只添加了一个。

    【讨论】:

    • 您描述的方法适用于索引列表固定的情况。 glob 模式将确保所有索引都具有别名。在我的场景中,每天都会添加新索引(由 AWS 中的 ISM 作业完成翻转)。这需要使用新创建的索引更新现有别名。这里的问题是我不控制翻转机制。这就是为什么我一直在寻找一种替代方法,通过使用别名以外的其他方式来提供用户 ID 过滤器。
    • elasticsearch 文档说的正好相反(也通过 Kibana 中的简单测试验证) - elastic.co/guide/en/elasticsearch/reference/master/… "POST /_aliases { "actions" : [ { "add" : { "index" : "test *", "alias" : "all_test_indices" } } ] } 在这种情况下,别名是一个时间点别名,它将对所有匹配的当前索引进行分组,它不会自动更新,因为匹配此模式的新索引是添加/删除。”
    • 抱歉,这令人困惑/误导:如果您继续添加索引,则需要通过模板应用别名(例如 Beats 正在做的事情)。我已经更新了答案并删除了评论。
    • 谢谢你,xeraa:-) 这给了我一个非常有用的指导,让我知道如何在我的场景中实现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2021-09-19
    • 1970-01-01
    • 2016-09-17
    • 2017-06-27
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多