一尘不染

弹性查询的性能

elasticsearch

每次执行此查询需要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毫秒。因此,第二个查询不仅运行速度更快,而且还缓存结果并将缓存用于后续调用。

所有这些都有解释吗?


阅读 205

收藏
2020-06-22

共1个答案

一尘不染

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

{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "id": "123456"
        }
      }
    }
  }
}
2020-06-22