备选方案

mw3dktmi  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(2)|浏览(414)

背景

我正在将es索引迁移到es版本6。我现在卡住了,因为es6删除了using on“\u type”字段。

旧实现(es2)

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

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

这里的关键点是,通过这种结构,我可以轻松地删除特定用户的所有文档。

DELETE /myindex/user-123

(删除特定用户的所有文档,只需一个命令)

问题

es6不再支持“\类型”。

可能的解决方案

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

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

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

问题:

我首先担心的是索引的数量和性能:拥有大约100万个索引在性能方面是可以接受的吗?别忘了我得经常查。
我的大多数用户都有少量文档存储在es中。对于<10个文档来说,持有一个应该很昂贵的碎片有意义吗?
我的数据架构对你来说合理吗?
欢迎提供任何其他提示!谢谢。

lskq00tm

lskq00tm1#

我不会每个用户有一个索引,这是一种资源浪费,特别是如果每个用户只有10个文档。
我要做的是使用过滤别名,每个用户一个。
所以索引将被命名为 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=*
icnyk63a

icnyk63a2#

拥有这么多的索引绝对不是一个好方法。如果您只关心用一个命令删除多个文档。然后可以使用elasticsearch提供的delete by query api
您可以在包含每个文档值的所有文档中引入“subtype”属性,例如“user-”值。所以在您的情况下,文档看起来是这样的。

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

相关问题