Elasticsearch 6.0 删除映射类型 - 替代方案
Elasticsearch 6.0 Removal of mapping types - Alternatives
背景
我正在将我的 ES 索引迁移到 ES 版本 6。我目前卡住了,因为 ES6 删除了“_type”字段上的使用。
旧实现 (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 个文档保留一个应该很昂贵的分片是否有意义?
- 我的数据架构对你来说合理吗?
欢迎任何其他提示!
谢谢。
我不会为每个用户创建一个索引,这是一种资源浪费,尤其是如果每个用户只有 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=*
这么多索引肯定不是什么好办法。如果您只关心使用单个命令删除多个文档。然后就可以使用ElasticSearch
提供的Delete by Query API
您可以在所有包含每个文档值的文档中引入 "subtype" 属性,例如 "user-" 值。所以在你的情况下,文件看起来像。
{
"attribute1":"value",
"subtype":"user-123"
}
背景
我正在将我的 ES 索引迁移到 ES 版本 6。我目前卡住了,因为 ES6 删除了“_type”字段上的使用。
旧实现 (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 个文档保留一个应该很昂贵的分片是否有意义?
- 我的数据架构对你来说合理吗?
欢迎任何其他提示! 谢谢。
我不会为每个用户创建一个索引,这是一种资源浪费,尤其是如果每个用户只有 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=*
这么多索引肯定不是什么好办法。如果您只关心使用单个命令删除多个文档。然后就可以使用ElasticSearch
提供的Delete by Query API您可以在所有包含每个文档值的文档中引入 "subtype" 属性,例如 "user-" 值。所以在你的情况下,文件看起来像。
{
"attribute1":"value",
"subtype":"user-123"
}