2015-04-23 44 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