弹性查询的性能

时间:2012-12-22 22:27:05

标签: performance caching elasticsearch

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

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

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

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

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

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

对所有这些都有解释吗?

1 个答案:

答案 0 :(得分:5)

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

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