查询与过滤器 - 执行顺序

时间:2013-07-19 14:50:11

标签: elasticsearch

我读过this question,我的一位同事让我怀疑:

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

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

2 个答案:

答案 0 :(得分:9)

幸运的是,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

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

答案 1 :(得分:1)

让我解释一下搜索查询的执行情况 -

首先,您需要搜索完整的参考文档。

如果搜索查询中包含过滤查询,那么它只会使该文档变小,或者换句话说,过滤查询是同一查询的缓存结果。 现在,您有一个较小的树可以使用查询文本进行搜索。

现在您的疑问部分 - 在过滤器中复制查询只会增加缓存机制的开销,并且有许多关于过滤查询中包含什么以及忽略什么的指导。这是相关性的全部。