Elasticsearch 6.0删除映射类型-替代方案

时间:2018-12-30 06:51:23

标签: elasticsearch elasticsearch-6

背景

我将ES索引迁移到ES版本6中。由于ES6删除了“ _type”字段上的using,因此我坚持不懈。

旧实现(ES2)

我的软件有许多用户(> 100K)。每个用户在ES中至少有一个文档。因此,层次结构如下所示:

INDEX  ->  TYPE      -> Document
myindex->  user-123  -> document-1

这里的关键在于这种结构,我可以轻松删除特定用户的所有文档。

DELETE /myindex/user-123

(使用单个命令删除特定用户的所有文档)

问题

ES6不再支持“ _type”。

可能的解决方案

将索引名称用作_type,而不是使用USER-ID。所以我的索引看起来像:

"user-123" -> "static-name" -> document

删除用户是通过删除索引完成的(而不是先前实现中的删除type)。

问题:

  • 我首先担心的是索引的数量和性能:就性能而言,拥有1M索引是否可以接受?别忘了我必须经常搜索它们。
  • 我的大多数用户在ES中存储的文档数量很少。对于少于10个文档,持有一个昂贵的碎片是否合理?
  • 我的数据架构对您来说合理吗?

任何其他提示都将受到欢迎! 谢谢。

2 个答案:

答案 0 :(得分:1)

我不会为每个用户提供一个索引,这会浪费资源,尤其是如果每个用户只有10个文档。

我要做的是使用filtered aliases,每个用户一个。

因此索引将被命名为users,并且类型将是静态名称,例如doc。对于用户123,该用户的文档将全部存储在users/doc/xyz中,并且您需要在每个文档中添加用户ID,例如

PUT users/doc/xyz
{
   ...
   "userId": 123,
   ...
}

然后,您可以为用户123的所有文档定义过滤的别名,如下所示:

POST /_aliases
{
    "actions" : [
        {
            "add" : {
                 "index" : "users",
                 "alias" : "user-123",
                 "filter" : { "term" : { "userId" : "123" } }
            }
        }
    ]
}

如果您需要删除用户123的所有文档,则只需执行以下操作:

POST user-123/_delete_by_query?q=*

答案 1 :(得分:0)

拥有这么多索引绝对不是一个好方法。如果您只关心用一个命令删除多个文档。然后,您可以使用ElasticSearch提供的Delete by Query API

您可以在所有文档中引入“ subtype”属性,其中包含每个文档的值,例如“ user-”值。因此,在您的情况下,文档看起来像这样。

{
  "attribute1":"value", 
  "subtype":"user-123"
}