Elasticsearch 过滤查询与过滤器
Elasticsearch Filtered query vs Filter
"query and filter in filtered"和"query and filter on the root"有区别吗?例如
案例 1:
{
"query":{
"filtered":{
"query":{
"term":{"title":"kitchen3"}
},
"filter":{
"term":{"price":1000}
}
}
}
}
案例二:
{
"query":{
"term":{"title":"kitchen3"}
},
"filter":{
"term":{"price":1000}
}
}
我找到了这个讨论 http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using-filter-outside-td3960119.html,但引用 URL 是 404,解释对我来说有点过于简洁。
请指教或给出文件指出这两者的区别,谢谢。
差异与性能有关。顶层的 "filter" 总是在 查询之后 执行。这意味着在所有文档上执行查询,为所有文档计算分数等 - 然后才排除不匹配过滤器的文档。
对于 "filtered" 查询,ES 有可能优化此计算,例如首先执行过滤器,然后对一组有限的文档执行查询,从而节省了测试与查询不匹配的文档的时间,以及如果它们与查询匹配则为它们计算分数的时间。
如果您使用同一个过滤器执行多个查询,那么还有更多优势:可以缓存过滤器,进一步提高每个查询的性能。这适用于您的示例:"term" 默认情况下缓存过滤器。
您还可以显式控制 "filtered" 查询的执行(请参阅文档)以针对您的特定用例对其进行优化。
这两种类型的过滤器也可以称为前置过滤器和post过滤器。正如@alexey 解释的那样,根级过滤器在查询之后执行,过滤查询中的过滤器在查询之前执行。
此外,您还需要了解相同的影响,然后再了解它们的执行顺序。 "filtered" 查询中的过滤器属于查询范围,这意味着在计算聚合时将考虑过滤后的输出,而在根级别过滤器的情况下,将仅对不包括过滤器的查询结果执行聚合。尽管在这两种情况下,结果文档都是相同的。
例如,对于您 posted 的两个查询,两者都会给出相同的结果,但是如果您正在执行聚合,第一个查询也会从匹配标题 kitchen3 和价格 10000 的文档中计算聚合计数,而第二个查询将仅从匹配标题 kitchen3 的文档中计算聚合计数,而不使用价格 1000 的过滤器。
"query and filter in filtered"和"query and filter on the root"有区别吗?例如
案例 1:
{
"query":{
"filtered":{
"query":{
"term":{"title":"kitchen3"}
},
"filter":{
"term":{"price":1000}
}
}
}
}
案例二:
{
"query":{
"term":{"title":"kitchen3"}
},
"filter":{
"term":{"price":1000}
}
}
我找到了这个讨论 http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using-filter-outside-td3960119.html,但引用 URL 是 404,解释对我来说有点过于简洁。
请指教或给出文件指出这两者的区别,谢谢。
差异与性能有关。顶层的 "filter" 总是在 查询之后 执行。这意味着在所有文档上执行查询,为所有文档计算分数等 - 然后才排除不匹配过滤器的文档。
对于 "filtered" 查询,ES 有可能优化此计算,例如首先执行过滤器,然后对一组有限的文档执行查询,从而节省了测试与查询不匹配的文档的时间,以及如果它们与查询匹配则为它们计算分数的时间。
如果您使用同一个过滤器执行多个查询,那么还有更多优势:可以缓存过滤器,进一步提高每个查询的性能。这适用于您的示例:"term" 默认情况下缓存过滤器。
您还可以显式控制 "filtered" 查询的执行(请参阅文档)以针对您的特定用例对其进行优化。
这两种类型的过滤器也可以称为前置过滤器和post过滤器。正如@alexey 解释的那样,根级过滤器在查询之后执行,过滤查询中的过滤器在查询之前执行。
此外,您还需要了解相同的影响,然后再了解它们的执行顺序。 "filtered" 查询中的过滤器属于查询范围,这意味着在计算聚合时将考虑过滤后的输出,而在根级别过滤器的情况下,将仅对不包括过滤器的查询结果执行聚合。尽管在这两种情况下,结果文档都是相同的。
例如,对于您 posted 的两个查询,两者都会给出相同的结果,但是如果您正在执行聚合,第一个查询也会从匹配标题 kitchen3 和价格 10000 的文档中计算聚合计数,而第二个查询将仅从匹配标题 kitchen3 的文档中计算聚合计数,而不使用价格 1000 的过滤器。