2015-10-17 84 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

由於您的用戶可以創建自己的過濾器,拇指的主要規則停留,即你應該嘗試以這樣的方式來訂購的過濾器,最嚴格的過濾器是第一位的。但是,如果您的用戶真的有能力創建他們自己的過濾器,並且不干擾他們提交的內容,那麼您應該教育他們(如果可能的話)如何最好地創建過濾器。