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

时间:2017-02-09 11:28:13

标签: performance search elasticsearch

我有一个弹性搜索索引 my_index ,包含数百万个文档,密钥为 my_uuid 。在该索引之上,我有以下几种过滤后的别名(仅显示GET my_index/_alias/my_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. 错误地写入。< / p>

指示性数字:

GET my_index/_search -> 50ms 
GET my_alias/_search -> 8000ms

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

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

1 个答案:

答案 0 :(得分:0)

用4MB的uid列表匹配每个文档绝对不是可行的方法。尝试想象它需要多少个CPU周期。 8s很快。

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

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

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

如果使用新的uuid更新子集不是时间紧迫的,则可以每天或每小时运行重新索引。