我有一个 elasticsearch 索引,my_index,包含数百万个文档,键为 my_uuid。在该索引之上,我有几个以下形式的过滤别名(仅显示my_alias,由GET my_index/_alias/my_alias
检索):
{
"my_index": {
"aliases": {
"my_alias": {
"filter": {
"terms": {
"my_uuid": [
"0944581b-9bf2-49e1-9bd0-4313d2398cf6",
"b6327e90-86f6-42eb-8fde-772397b8e926",
thousands of rows...
]
}
}
}
}
}
}
我的理解是过滤器会为我透明地缓存,不需要做任何配置。问题是,在通过别名时,我的搜索速度非常慢,这表明 1.过滤器未缓存,或 2.写错了。
指示数字:
GET my_index/_search -> 50ms
GET my_alias/_search -> 8000ms
如果有人认为相关,我可以提供有关集群规模和数据大小的更多信息。
我正在使用 elasticsearch 2.4.1。我得到了正确的结果,这只是我关心的表现。
最佳答案
将每个文档与 4MB 的 uid 列表匹配绝对不是可行的方法。试着想象一下它需要多少个 CPU 周期。 8s 相当快。
我会在另一个索引中复制数据子集。
如果您需要立即反射(reflect)更改,则必须手动管理子集索引:
- 当您从列表中删除一个 uuid 时,您会删除相应的文件
- 当你添加一个 uuid 时,你复制相应的文件(reindex api with a query 是你的 friend )
- 当你插入一个文档时,你必须检查该文档是否也应该被添加到子集索引中
- 当你删除一个文档时,在两个索引中都删除它 强制文档 ID,以便它们在两个索引中相同。如果将 uuid 列表存储在 elasticsearch 索引中,请注意刷新时间。
如果使用新的 uuid 更新子集不是时间紧迫的,您可以每天或每小时运行重新索引。
关于performance - 在 Elasticsearch 中使用过滤器搜索别名非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42135496/