2015-04-23 47 views
2

我在Azure搜索中具有3個相同(在Text中)項目的集合,因價格和點數而異。價格更便宜的產品價格上漲。 (價格上漲多了點,反而上漲)。Azure搜索得分

但是,我一直看到類似這樣的搜索結果。

搜索是在'約翰米爾頓'。

我得到

Product="Id = 2-462109171829-1, Price=116.57, Points= 7, Name=Life of Schamyl/John Milton Mackie, Description=.", Score=32.499783 
Product="Id = 2-462109171829-2, Price=116.40, Points= 9, Name=Life of Schamyl/John Milton Mackie, Description=.", Score=32.454872 
Product="Id = 2-462109171829-3, Price=115.64, Points= 9, Name=Life of Schamyl/John Milton Mackie, Description=.", Score=32.316270 

我希望進球爲了這樣的事情,用最低的價格第一。

Product="Id = 2-462109171829-3, Price=115.64, Points= 9, Name=Life of Schamyl/John Milton Mackie, Description=.", Score= 
Product="Id = 2-462109171829-2, Price=116.40, Points= 9, Name=Life of Schamyl/John Milton Mackie, Description=.", Score= 
Product="Id = 2-462109171829-1, Price=116.57, Points= 7, Name=Life of Schamyl/John Milton Mackie, Description=.", Score= 

我缺少什麼或者是小的評分變化可接受?

該指數定義爲

let ProductDataIndex = 

     let fields = 
        [| 
         new Field (
          "id", 
          DataType.String, 
          IsKey   = true, 
          IsSearchable = true); 


         new Field (
          "culture", 
          DataType.String, 
          IsSearchable = true); 

         new Field (
          "gran", 
          DataType.String, 
          IsSearchable = true); 

         new Field (
          "name", 
          DataType.String, 
          IsSearchable = true); 

         new Field (
          "description", 
          DataType.String, 
          IsSearchable = true); 

         new Field (
          "price", 
          DataType.Double, 
          IsSortable  = true, 
          IsFilterable = true) 

         new Field (
          "points", 
          DataType.Int32, 
          IsSortable  = true, 
          IsFilterable = true) 
        |] 

     let weightsText = 
      new TextWeights(
       Weights = ([| 
           ("name",  4.); 
           ("description", 2.) 
          |] 
          |> dict)) 

     let priceBoost = 
      new MagnitudeScoringFunction(
       new MagnitudeScoringParameters(
        BoostingRangeStart = 1000.0, 
        BoostingRangeEnd = 0.0, 
        ShouldBoostBeyondRangeByConstant = true), 
       "price", 
       10.0) 

     let pointsBoost = 
      new MagnitudeScoringFunction(
       new MagnitudeScoringParameters(
        BoostingRangeStart = 0.0, 
        BoostingRangeEnd = 10000000.0, 
        ShouldBoostBeyondRangeByConstant = true), 
       "points", 
       2.0) 

     let scoringProfileMain = 
      new ScoringProfile (
          "main", 
          TextWeights = 
           weightsText, 
          Functions = 
           new List<ScoringFunction>(
             [ 
              priceBoost  :> ScoringFunction 
              pointsBoost  :> ScoringFunction 
             ]), 
          FunctionAggregation = 
           ScoringFunctionAggregation.Sum) 

     new Index 
      (Name    = ProductIndexName 
      ,Fields    = fields 
      ,ScoringProfiles = new List<ScoringProfile>(
             [ 
              scoringProfileMain 
             ])) 
+0

嗨Hocho,快速澄清問題,索引中有多少文檔?文件數量較少的索引中的評分可能稍微偏低。這是他們如何在內部組織的結果,以實現分佈式服務的高效擴展和縮減。 – Yahnoosh

+0

3000萬文件。我正在做一些概念驗證測試,因此除了識別字段以及分別在10%的範圍內隨機生成的價格和點數字段以外,所有相同的字段都會複製3次。 – hocho

+0

謝謝!當您發出選擇性較低的查詢時,您是否看到相同的行爲?例如:「John」(假設您的數據集中有多個John) – Yahnoosh

回答

4

在Azure中搜索所有指標都分成多個碎片,使我們快速擴大規模和尺度起伏。當發出搜索請求時,它會獨立地針對每個分片發佈。然後將每個分片的結果集合並按照分數排序(如果沒有定義其他排序)。 重要的是要知道,評分函數在每個文檔中對所有文檔中的頻率權重查詢詞頻率,在分片中!

這意味着在您的場景中,每個文檔都有三個實例,即使禁用了打分配置文件,如果其中一個文檔與另外兩個文檔位於不同的分片上,其分數也會略有不同。您的指數中的數據越多,差異越小(更均勻的期限分佈)。無法假定在哪個分片上放置任何給定的文檔。

一般來說,文檔分數並不是訂購文檔的最佳屬性。它只應該給你一般意義上的文檔與結果集中其他文檔的相關性。在您的情況下,如果您將價格和/或點數字段標記爲可排序,則可以按價格和/或點數對結果進行排序。你可以在這裏找到更多的信息如何使用$ orderby查詢參數:https://msdn.microsoft.com/en-us/library/azure/dn798927.aspx

+0

謝謝!你清楚的解釋有很多幫助。 – hocho

+0

這裏只有一個問題,如果我按分數排序,如果我的搜索條件相同且數據在索引中沒有更改,那麼它不應該隨呼叫而變化。但對我來說,使用分頁,從一頁翻到另一頁並回到第一頁,我看到不同的分數。怎麼會這樣? – Diceyus

+0

您是否看到同一項目或同一項目的不同順序的不同分數?看看這個問題,如果它是後者:https://stackoverflow.com/questions/43592776/paging-in-azure-search-when-results-have-equal-scores – Yahnoosh