2015-10-17 83 views
0

elasticsearch是否自动优化过滤器?例如:在“和”过滤器中,如果为gte和lte运算符分别定义了多个数值范围过滤器,而不是具有lte和gte界限的一个范围过滤器,它是否会导致任何性能问题? ES会自动优化这些过滤器吗?elasticsearch和过滤器优化

"filter" : { 
"and" : [ 
    { 
    "range" : { 
      "age" : { 
      "gte": 10 
      } 
    } 
    }, 
    { 
    "range" : { 
      "age" : { 
       "lte": 90 
      } 
    } 
    }, 
    { 
    "range" : { 
      "age" : { 
      "gte": 30 
      } 
    } 
    }                
]} 

更新

想补充:虽然是有意义的边界结合起来,我想柜面检查这个时候,我谁可以动态创建过滤器的用户做这样的情景。

回答

2

带过滤器的主要经验法则是,您应该始终首先应用最具限制性的过滤器,以减少匹配文档集并允许下一个过滤器尽可能少地处理文档。

而且,在你出的情况下,它并没有真正意义的有三种不同的range过滤器相同age场,你应该把它们合并成一个单一的一个:

"filter": { 
    "range": { 
     "age": { 
      "gte": 30, 
      "lte": 90 
     } 
    } 
} 

而且请注意,只要可能,您应该更喜欢bool/must而不是and过滤器,如in this excellent article所述,主要是因为and过滤器没有被高速缓存。

最后,以上仅适用于2.0之前的Elasticsearch版本。从2.0开始,整个查询/过滤器DSL将为completely overhauled,查询将更加智能化。

UPDATE

由于您的用户可以创建自己的过滤器,拇指的主要规则停留,即你应该尝试以这样的方式来订购的过滤器,最严格的过滤器是第一位的。但是,如果您的用户真的有能力创建他们自己的过滤器,并且不干扰他们提交的内容,那么您应该教育他们(如果可能的话)如何最好地创建过滤器。