一尘不染

查询与过滤器-执行顺序

elasticsearch

我已经读过这个问题,我的一个同事让我感到怀疑:

在过滤查询中,何时应用过滤器?在执行查询之前还是之后?什么时候缓存结果?

如果事先应用了过滤器,那么在过滤器中复制查询部分不是一件好事吗?如果之后应用了筛选器,那么我将无法理解缓存的内容。


阅读 280

收藏
2020-06-22

共1个答案

一尘不染

幸运的是,ES为您提供了两种类型的过滤器供您使用:

{
  "query" : {
    "field" : { "title" : "Catch-22" }
  },
  "filter" : {
    "term" : { "year" : 1961 }
  }
}


{
  "query": {
    "filtered" : {
      "query" : {
        "field" : { "title" : "Catch-22" }
      },
      "filter" : {
        "term" : { "year" : 1961 }
      }
    }
  }
}

在第一种情况下,过滤器将应用于查询找到的所有文档。在第二种情况下,将在查询运行之前过滤文档。这样可以产生更好的性能。

引用自:http : //www.packtpub.com/elasticsearch-server-for-
fast-scalable-flexible-search-
solution/book

关于缓存,我不确定过滤器的缓存机制。我的猜测是:第一种情况,由于过滤器是针对查询返回的一组结果,因此缓存是特定于此返回集的。第二种情况是,首先应用过滤器,然后为您检查的索引存储高速缓存,因此,此高速缓存更可重用,因为它不依赖查询的内容,但是第一次需要较大的内存开销和查询时间(在生成缓存之前)。

2020-06-22