Azure 搜索评分

Azure Search scoring

我在 Azure 搜索中有 3 个相同的(文本)项目,价格和点数各不相同。具有更高积分的更便宜的产品被提升得更高。 (价格提升幅度大于点数,反之提升)。

但是,我不断看到与此类似的搜索结果。

搜索“john milton”。

我明白了

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
                                        ]))

Azure 搜索中的所有索引都被分成多个分片,使我们能够快速扩大和缩小规模。当发出搜索请求时,它是针对每个分片独立发出的。然后合并每个分片的结果集并按分数排序(如果未定义其他排序)。 重要的是要知道评分函数在每个文档中的查询词频率与其在所有文档中的频率的权重,在碎片 中!

这意味着在您的场景中,每个文档都有三个实例,即使禁用了评分配置文件,如果其中一个文档落在与其他两个不同的分片上,其分数也会略有不同。索引中的数据越多,差异就越小(术语分布更均匀)。无法假设任何给定文档将放置在哪个分片上。

一般来说,文档分数并不是排序文档的最佳属性。它应该只让您大致了解文档与结果集中其他文档的相关性。在您的场景中,如果您将价格 and/or 点字段标记为可排序,则可以按价格 and/or 点对结果进行排序。您可以在此处找到有关如何使用 $orderby 查询参数的更多信息:https://msdn.microsoft.com/en-us/library/azure/dn798927.aspx