【问题标题】:Searching through an alias with filter is very slow in Elasticsearch在 Elasticsearch 中使用过滤器搜索别名非常慢
【发布时间】:2017-06-27 09:23:57
【问题描述】:

我有一个弹性搜索索引,my_index,包含数百万个文档,键为 my_uuid。在该索引之上,我有几个 filtered aliases 以下形式(仅显示 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. 写错了

指示性数字:

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

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

我使用的是弹性搜索 2.4.1。我得到了正确的结果,这只是我关心的表现。

【问题讨论】:

  • 当您直接运行搜索查询并添加应用于别名的过滤器时会发生什么。需要时间吗?
  • 您是否检查过my_uuidnot_analyzed?但是过滤器上的数千个术语似乎很重。如果您在索引时知道这些 uuid,则可以向每个文档添加一个新字段 aliases。那么您的过滤器将只有一个术语。
  • @NikoNyrh my_uuidnot_analyzed。事实上,我在索引时就知道它们,但它们是批量动态更新的,所以我不想将它们硬编码到可搜索的文档中。
  • 嗨@pratikvasa。我进行了测试并得到了相似的时间。问题是,由于my_uuids 的数量,我在不使用过滤器的别名时必须发送的查询大约为 4MB,并且仅上传查询大约需要 6 秒。所以我想这不是一个可行的解决方案。
  • ohk..通过类似的时间你的意思是你得到大约 8 秒,其中包括 6 秒发送查询?

标签: performance search elasticsearch


【解决方案1】:

将每个文档与 4MB 的 uid 列表匹配绝对不是要走的路。试着想象它需要多少 CPU 周期。 8s相当快。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2019-04-25
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多