2016-08-02 465 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过程有了更好的理解 –