ElasticSearch - function_score(random_score 具體實例)

古古

2018/07/07


閱讀本文需要先了解 function_score 的相關知識,請看 ElasticSearch - function_score 簡介

  • 在正常的查詢下,有相同評分的 score 的文檔會每次都會以相同次序出現,但是爲了提高展現率,在此引入一些隨機性可能會是個好主意,這能保證有相同評分的文檔都能有均等相似的展現機率

    • 但是,在隨機的同時,除了想讓不同的用戶看到不同的隨機次序之外,但也希望如果是同一用戶翻頁瀏覽時,結果的相對次序能始終保持一致,這種行爲被稱爲 一致隨機(consistently random)
    • 因此 random_score 加強函數除了能隨機得到一個 0 ~ 1 的分數,也會使用一個 seed 值,來保障生成隨機的順序,當 seed 值相同時,生成的隨機結果是一致的
  • 先準備數據和索引,在 ES 插入三筆數據,其中 language 是 keyword 類型,like 是 integer 類型(代表點贊量)

    { "language": "java", "like": 5 }
    { "language": "python", "like": 5 }
    { "language": "go", "like": 10 }
    
  • 使用 random_score 生成隨機排序

    • 注意在 functions 裡,只有 weight 加強函數加了 filter,也就是說只有 like 數小於等於 5 的文檔,才會被 weight 加強函數加強

    • 而 random_score 加強函數沒有加 filter,表示所有的文檔都會被 random_score 隨機排序一遍

      GET mytest/doc/_search
      {
          "query": {
              "function_score": {
                  "query": {
                      "match_all": {}
                  },
                  "functions": [
                      {
                          "filter": {
                              "range": {
                                  "like": {
                                      "lte": 5
                                  }
                              }
                          },
                          "weight": 2
                      },
                      {
                          "random_score": {
                              "seed": 100
                          }
                      }
                  ]
              }
          }
      }
      
    • 當 random_score 的 seed 設為 100,其結果為

      "hits": [
          {
              "_score": 1.2912227,
              "_source": { "language": "python", "like": 5 }
          },
          {
              "_score": 1.1301208,
              "_source": { "language": "java", "like": 5 }
          },
          {
              "_score": 0.9083528,
              "_source": { "language": "go", "like": 10 }
          }
      ]
      
    • 當 random_score 的 seed 設為 200,其結果為

      "hits": [
          {
              "_score": 1.2040303,
              "_source": { "language": "java", "like": 5 }
          },
          {
              "_score": 0.5595852,
              "_source": { "language": "go", "like": 10 }
          },
          {
              "_score": 0.10916698,
              "_source": { "language": "python", "like": 5 }
          }
      ]