我读过这个问题,我的一位同事让我怀疑:
在过滤查询中,何时应用过滤器?在执行查询之前还是之后?什么时候缓存结果?
如果预先应用了过滤器,那么在过滤器中复制查询部分不是一件好事吗?如果之后应用过滤器,那么我无法理解缓存的内容。
我读过这个问题,我的一位同事让我怀疑:
在过滤查询中,何时应用过滤器?在执行查询之前还是之后?什么时候缓存结果?
如果预先应用了过滤器,那么在过滤器中复制查询部分不是一件好事吗?如果之后应用过滤器,那么我无法理解缓存的内容。
幸运的是,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
关于缓存,我不确定过滤器的缓存机制。我的猜测是:第一种情况,由于过滤器针对查询返回的一组结果,缓存是特定于这个返回集的。第二种情况,首先应用过滤器,缓存是为您检查的索引存储的,因此,这个缓存更可重用,因为它不依赖于查询的内容,但第一次有更大的内存成本和查询时间(在生成缓存之前)。
让我解释一下搜索查询执行-
首先,总有一份完整的参考文献供您搜索。
如果您在搜索查询中包含过滤查询,那么它只会使该文档更小,或者换句话说,过滤查询是相同查询的缓存结果。现在,您有一个较小的树可以使用您的查询文本进行搜索。
现在您的疑问部分-在过滤器中复制查询只会增加缓存机制的开销,并且有很多关于过滤器查询中包含哪些内容和忽略哪些内容的指南。这都是相关性的游戏。