在Elasticsearch中使用过滤器搜索别名非常慢

yan*_*isf 9 performance search elasticsearch

我有一个弹性搜索索引my_index,包含数百万个文档,密钥为my_uuid.在该索引之上,我有几个以下形式的过滤别名(仅显示检索到的my_aliasGET 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...
                        ]
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的理解是过滤器将为我透明地缓存,而不必进行任何配置.事情是,我在浏览别名时经历了非常慢的搜索,这表明1. 过滤器没有被缓存,或者2. 它被错误地写入.

指示性数字:

GET my_index/_search -> 50ms 
GET my_alias/_search -> 8000ms
Run Code Online (Sandbox Code Playgroud)

如果有人认为这是相关的,我可以提供有关集群规模和数据大小的更多信息.

我正在使用elasticsearch 2.4.1.我得到了正确的结果,这只是关注我的表现.

bok*_*kan 0

将每个文档与 4MB 的 uid 列表进行匹配绝对不是正确的方法。尝试想象一下它需要多少个 CPU 周期。8s还是蛮快的

我会在另一个索引中复制数据子集。

如果您需要立即反映更改,则必须手动管理子集索引:

  • 当你从列表中删除一个uuid时,你就会删除相应的文档
  • 当您添加 uuid 时,您会复制相应的文档(带有查询的 reindex api 是您的朋友)
  • 当您插入文档时,您必须检查该文档是否也应该添加到子集索引中
  • 当您删除文档时,请在两个索引中删除它 强制文档 ID,以便它们在两个索引中相同。如果将 uuid 列表存储在 elasticsearch 索引中,请注意刷新时间。

如果使用新的 uuid 更新子集对时间要求不高,您可以每天或每小时运行重新索引。