【问题标题】:ElasticSearch Filtered Aliases Creation - Best PracticeElasticSearch 过滤别名创建 - 最佳实践
【发布时间】:2015-08-10 06:54:53
【问题描述】:

我们计划使用此处提到的过滤别名 - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html

我们的输入数据将是一个流,流的每一行都对应一个我们想要存储在 ES 中的对象。

每个对象都包含一个“id”,我们将其用于路由和过滤。

问题 - 我们如何以高效的方式创建别名和索引数据?

-- 我们是否为所有数据编制索引,跟踪所有唯一的 'id',最后创建过滤别名?或者

-- 对于每个对象,检查该 'id' 的别名是否存在;如果它没有创建一个?

我倾向于第一种方法。与第二种方法相比,它是否可取且高效?

TIA。

【问题讨论】:

  • 你有多少个索引?你要索引多少数据?在您为初始数据集编制索引后,是否会有更多具有不同 ID 的数据需要创建新的过滤别名?
  • @Val - 我的应用程序只有一个索引(我们有一个其他应用程序共享的通用 ES 集群)。这是一项在 ES 中填充数据的日常工作,我们认为它不超过千万个条目(每次运行)。是的,在随后的每次运行中,我们可能会添加对应于不同 id 的新条目,这将需要创建新的过滤别名。
  • 好吧,还有一件事:该 id 字段的基数是多少(即大约有多少个不同的唯一 ID)?
  • @Val - 唯一 ID 不应超过 100 个,因此过滤别名的数量应不超过 100 个。
  • 好的,别名的全部目的是能够在一个逻辑名称下联合多个索引,但是由于您只有一个索引,所以您根本不需要别名。如果您在该特定 id 字段上使用路由,那么在我看来,实现您所需要的就绰绰有余了。

标签: elasticsearch aliases


【解决方案1】:

根据我们上面的讨论,在浏览了您发布的博客文章之后,我非常肯定在您的情况下,您根本不需要别名,并且路由键就足够了。同样,仅仅因为你有一个索引,如果你有很多索引,这将不再是真的!

您只需指定索引文档时要使用的路由键。在 ES 2.0 之前,您可以将 _routing field 用于此目的,即使它在 ES 1.5 中已被弃用,但在您的情况下,它可以满足您的目的。

{
    "customer" : {
        "_routing" : {
            "required" : true,
            "path" : "customer_id"     <----- the field you use as the routing key
        },
        "properties": { ... }
    }
}

然后,在搜索时,除了客户 ID 过滤器之外,您只需在搜索 URL 中指定 &amp;routing=&lt;customer_id&gt;(因为给定的分片可以托管不同客户的文档)。您的搜索将直接转到由给定路由键标识的分片,因此,仅检索来自指定客户的数据。

为此使用过滤别名不会带来任何好处,因为您在别名定义中包含的过滤器和路由键不会产生任何额外的影响,因为检索到的文档已经被路由键“过滤”(某种程度)。这比尝试检测(在要索引的每个新文档上)是否存在别名并在不存在时创建它要容易得多。

更新:

现在,如果您绝对拥有/想要创建过滤别名,那么您提到的第一种方式将是更高效的方式:

  1. 首先索引您的每日数据
  2. 然后在customer_id 字段上运行terms 聚合,size 足够高(即高于字段的基数,在您的情况下约为 100),以确保您捕获所有唯一的客户 ID创建你的别名
  3. 遍历所有存储桶以检索所有唯一的客户 ID
  4. 为每个customer_id 使用一个actionone shot 中创建所有别名
curl -XPOST 'http://localhost:9200/_aliases' -d '{
    "actions" : [
        {
            "add" : {
                 "index" : "customers",
                 "alias" : "alias_cid1",
                 "routing" : "cid1",
                 "filter" : { "term" : { "customer_id" : "cid1" } }
            }
        },
        {
            "add" : {
                 "index" : "customers",
                 "alias" : "alias_cid2",
                 "routing" : "cid2",
                 "filter" : { "term" : { "customer_id" : "cid2" } }
            }
        },
        {
            "add" : {
                 "index" : "customers",
                 "alias" : "alias_cid3",
                 "routing" : "cid3",
                 "filter" : { "term" : { "customer_id" : "cid3" } }
            }
        },
        ...
    ]
}'

请注意,如果别名已经存在,您不必担心,整个命令不会失败并默默地忽略现有别名。

运行此命令后,您的唯一索引上将拥有所有别名,并使用过滤器和路由键正确配置。

【讨论】:

  • 非常感谢,瓦尔。我们计划很快升级到 ES 1.5,所以 _routing 可能不起作用?在那种情况下,有什么替代方法?
  • 在索引文档时始终可以使用路由参数,无论是one-off 还是通过bulk API
  • 我现在明白了:-)。那么,过滤器别名的意义是什么?只是为了充分披露,如果我确实在创建过滤别名,那么哪种方法最有效(我原来的问题)?谢谢。
猜你喜欢
  • 2019-10-22
  • 2020-06-06
  • 2014-05-23
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2020-01-15
相关资源
最近更新 更多