2016-08-02 214 views
2

當我在查詢中使用random_score時,我發現獲取查詢結果花費大約150多毫秒(如果不使用random_score,大約需要250毫秒才能得到結果)。elasticsearch使用random_score會降低性能

原始查詢

{ 
"size": 10, 
"query": { 
    "function_score": { 
     "query": { 
      "bool": { 
       "must": [ 
        { 
         "query_string": { 
          "fields": [ 
           "sound_title", 
           "album_title" 
          ], 
          "query": "0" 
         } 
        } 
       ] 
      } 
     }, 
     "functions": [ 
      { 
       "filter": { 
        "bool": { 
         "must": [ 
          { 
           "term": { 
            "sound_chapters": 1 
           } 
          } 
         ] 
        } 
       }, 
       "weight": 1.2 
      }, 
      { 
       "field_value_factor": { 
        "field": "album_playcount", 
        "modifier": "log", 
        "missing": "100" 
       } 
      } 
     ], 
     "score_mode": "sum" 
     } 
    } 
} 

查詢與random_score

{ 
"size": 10, 
"query": { 
    "function_score": { 
     "query": { 
      "bool": { 
       "must": [ 
        { 
         "query_string": { 
          "fields": [ 
           "sound_title", 
           "album_title" 
          ], 
          "query": "0" 
         } 
        } 
       ] 
      } 
     }, 
     "functions": [ 
      { 
       "filter": { 
        "bool": { 
         "must": [ 
          { 
           "term": { 
            "sound_chapters": 1 
           } 
          } 
         ] 
        } 
       }, 
       "weight": 1.2 
      }, 
      { 
       "field_value_factor": { 
        "field": "album_playcount", 
        "modifier": "log", 
        "missing": "100" 
       } 
      }, 
      { 
       "random_score": { 
        "seed": "123" 
       } 
      } 
     ], 
     "score_mode": "sum" 
     } 
    } 
} 

還有什麼辦法優化查詢,以提高更好的性能?

回答

3

如果您將任何更多的功能添加到任何ElasticSearch查詢,ES將需要一些處理時間將該函數的分數包括在主分數中,從而增加整體時間。 您可以閱讀更多有關elasticsearch here的隨機評分。

提高查詢性能的最常見方法是使用filters而不是query,因爲過濾器已被緩存。但是如果你的服務器有足夠的內存,就應該這樣做。

您可以從博客here中獲得更多創意。

+0

thx,但我只是不明白爲什麼性能可以減少很多(從約250毫秒到約400毫秒)。我的理解是,random_score只會將0到1之間的隨機分數添加到主要分數中,並且一般來說,生成隨機數並不是一個耗時的過程,因此只需要更多的時間將random_score函數分數包含到主要得分。 –

+0

@ThidtcWh這是因爲隨機評分不是純粹隨機的。它是「持續隨機」評分,這意味着對於同一用戶,您將獲得相同的隨機分數,這種類型的活動將需要時間來存儲和獲取每個用戶的數據。我在回答中添加了隨機得分的鏈接,您應該閱讀一次,至少可以更好地理解'種子'的使用。' –

+0

非常感謝您的耐心回答,現在我對random_score過程有了更好的理解 –