2015-04-23 4 views
2

У меня есть наборы из 3 одинаковых (в тексте) предметов в Azure Search, различающихся по цене и точкам. Более дешевые продукты с более высокими очками повышаются. (Цена увеличивается больше очков, а наоборот увеличивается).Azure Поиск скоринга

Однако, я продолжаю видеть результаты поиска, подобные этому.

Поиск находится на '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 
             ])) 
+0

Привет, Hocho, вопрос о быстром уточнении, сколько документов в вашем индексе? Скоринг в индексах с низким количеством документов может немного отличаться. Это результат того, как они организованы внутри страны, чтобы обеспечить эффективные масштабирование и масштабирование распределенного сервиса. – Yahnoosh

+0

30+ миллионов документов. Я делаю некоторые доказательства тестирования концепции, поэтому каждый документ реплицируется 3 раза со всеми одинаковыми полями, за исключением поля «Идентификация» и полей «Цена и точки», случайным образом генерируемых в пределах 10% друг от друга соответственно. – hocho

+0

Спасибо! Вы видите такое же поведение, когда вы выдаете запрос, который менее избирателен? Например: «Джон» (если у вас в вашем наборе данных больше одного Джона :)) – Yahnoosh

ответ

4

Все индексы в Azure Поиск разбивается на несколько черепков, позволяя нам для быстрого масштаба вверх и масштабных падений. Когда выдается запрос на поиск, он выдается по каждому из осколков независимо. Затем набор результатов от каждого из осколков объединяется и упорядочивается по счету (если не определено другое упорядочение). Важно знать, что функция подсчета веса весит частоту запроса в каждом документе против его частоты во всех документах, в осколке!

Это означает, что в вашем сценарии, в котором у вас есть три экземпляра каждого документа, даже с отключенными профилями, если один из этих документов попадает на другой осколок, чем два других, его оценка будет немного отличаться. Чем больше данных в вашем индексе, тем меньше будет разница (более равномерное распределение сроков). Невозможно предположить, на каком осколке будет помещен какой-либо документ.

В целом, оценка документов не является лучшим атрибутом для оформления документов. Это должно дать вам общее представление о релевантности документа в отношении других документов в наборе результатов. В вашем сценарии можно было бы заказывать результаты по цене и/или пунктам, если вы помечали поля с ценами и/или точками как сортируемые. Вы можете найти дополнительную информацию о том, как использовать параметр $ orderby query здесь: 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

Смежные вопросы