【问题标题】:Performance of elastic queries弹性查询的性能
【发布时间】:2012-12-23 11:14:43
【问题描述】:

此查询每次执行需要 200+ 毫秒:

{
  "filter": {
    "term": {
      "id": "123456",
      "_cache": true
    }
  }
}

但是这个在第一次查询后每次执行只需要2-3毫秒:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "id": "123456"
        }
      }
    }
  }
}

注意两个查询中的相同 ID 值。看起来第二个查询使用了第一个查询的缓存结果。但是为什么第一个查询不能使用缓存结果本身呢?从第一个查询中删除 "_cache" : true 不会改变任何内容。

当我使用其他 ID 执行第二个查询时,第一次执行大约需要 40 毫秒,之后每次执行大约需要 2-3 毫秒。所以第二个查询不仅运行速度更快,而且还缓存了结果,并将缓存用于后续调用。

这一切都有解释吗?

【问题讨论】:

    标签: performance caching elasticsearch


    【解决方案1】:

    第一个请求中的顶级filter元素在Elasticsearch中具有非常特殊的功能。它用于过滤搜索结果而不影响方面。为了避免干扰构面,此过滤器在结果收集期间而不是在搜索期间应用,这会导致其性能下降。使用不带构面的顶级 filter 意义不大,因为 filteredconstant_score 查询通常会提供更好的性能。如果filtered 查询与match_all 的冗长困扰您,您可以将第二个请求重写为等效的constant_score 查询:

    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "id": "123456"
            }
          }
        }
      }
    }
    

    【讨论】:

    • 它不会打扰我。我正在尝试学习如何以最有效的方式查询 Elastic,而他们写得不好的文档对我没有多大帮助。所以我在这里问所有这些问题。再次感谢您的帮助!
    猜你喜欢
    • 2016-12-25
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多