弹性查询的性能

And*_*rei 3 performance caching elasticsearch

每次执行时,此查询需要200多毫秒:

{
  "filter": {
    "term": {
      "id": "123456",
      "_cache": true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "id": "123456"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

当我用其他ID执行第二个查询时,第一次执行它需要大约40毫秒,之后每次需要2-3毫秒.因此,第二个查询不仅工作得更快,而且还缓存结果并将缓存用于后续调用.

所有这些都有解释吗?

imo*_*tov 5

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

{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "id": "123456"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)