查询与过滤器 - 执行顺序

Cry*_*ark 5 elasticsearch

我读过这个问题,我的一位同事让我怀疑:

在筛选查询中,何时应用过滤器?在执行查询之前或之后?结果何时缓存?

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

Z.T*_*ang 9

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

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


{
  "query": {
    "filtered" : {
      "query" : {
        "field" : { "title" : "Catch-22" }
      },
      "filter" : {
        "term" : { "year" : 1961 }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

关于缓存,我不确定过滤器的缓存机制.我的猜测是:第一种情况,因为过滤器是针对查询返回的一组结果,所以缓存是特定于此返回集的类型.第二种情况,首先应用过滤器,为你检查的索引存储缓存,因此,这个缓存更可重用,因为它不依赖于查询的内容,但是第一次内存成本和查询时间更长(在生成缓存之前).