2016-03-02 217 views
0

以下查詢具有可怕的性能。可怕的has_child查詢性能

100%肯定它是has_child。沒有它的查詢運行在300毫秒以下,它需要9秒。

有沒有更好的方法來使用has_child查詢?好像我可以通過ID查詢的父母,然後孩子再加入客戶端做了檢查孩子比ES數據庫引擎更快的是做什麼的?

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "bool": { 
        "must": [ 
         { 
          "has_child": { 
           "type": "status", 
           "query": { 
            "term": { 
             "stage": "s3" 
            } 
           } 
          } 
         }, 
         { 
          "has_child": { 
           "type": "status", 
           "query": { 
            "term": { 
             "stage": "es" 
            } 
           } 
          } 
         } 
        ] 
       } 
      }, 
      "filter": { 
       "bool": { 
        "must": [ 
         { 
          "term": { 
           "source": "IntegrationTest-2016-03-01T23:31:15.023Z" 
          } 
         }, 
         { 
          "range": { 
           "eventTimestamp": { 
            "from": "2016-03-01T20:28:15.028Z", 
            "to": "2016-03-01T23:33:15.028Z" 
           } 
          } 
         } 
        ] 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "digests": { 
      "terms": { 
       "field": "digest", 
       "size": 0 
      } 
     } 
    }, 
    "size": 0 
} 

集羣信息: CPU和內存使用率低。它是AWS ES服務集羣(v1.5.2)。許多小文件,並且由於版本aws運行的是舊的,默認情況下doc值不是默認打開的。不知道這是幫助還是傷害。

+0

「舞臺」是一個分析領域嗎?只是好奇,如果你可以通過使用'has_child' *過濾器*而不是查詢來優化一點。 – BrookeB

+0

@BrookeB「舞臺」已編入索引但未進行分析。你的意思是把內部「查詢」改爲「過濾器」而不是? – smashbourne

回答

-1

我忍辱負重,只是執行的家長:孩子在我的應用程序加入。我沒有等待7秒鐘的has_child查詢,而是連續發起兩個查詢,並進行一些後期處理:200ms。

0

由於「階段」不是分析(根據您的評論),因此,您不感興趣的得分匹配該字段的文件,你可以通過使用has_child過濾,而不是實現輕微的性能提升has_child查詢。並使用term過濾器而不是term查詢

documentationhas_child,你會發現:

的has_child過濾器也接受一個過濾器,而不是一個查詢:來自

使用過濾器的主要性能優勢事實上Elasticsearch可以跳過查詢的評分階段。此外,可以緩存過濾器,這可以提高使用相同過濾器的未來搜索的性能。另一方面,查詢不能被緩存。

試試這個:

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "source": "IntegrationTest-2016-03-01T23:31:15.023Z" 
       } 
      }, 
      { 
       "range": { 
       "eventTimestamp": { 
        "from": "2016-03-01T20:28:15.028Z", 
        "to": "2016-03-01T23:33:15.028Z" 
       } 
       } 
      }, 
      { 
       "has_child": { 
       "type": "status", 
       "filter": { 
        "term": { 
        "stage": "s3" 
        } 
       } 
       } 
      }, 
      { 
       "has_child": { 
       "type": "status", 
       "filter": { 
        "term": { 
        "stage": "es" 
        } 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "digests": { 
     "terms": { 
     "field": "digest", 
     "size": 0 
     } 
    } 
    }, 
    "size": 0 
} 
+0

不幸的是,無論使用過濾器還是查詢,它都會執行相同的操作。看起來has_child查詢非常慢。我已經測試了更快的硬件,更多/更少的節點集羣,並沒有什麼區別 – smashbourne

+0

@smashbourne Bummer。我聽到其他人在父母/孩子文件上有性能問題。我認爲他們在2.x上做了改進,未來可能對你更好。 – BrookeB