solr score打分模式及其问题



在新房索引实例中,根据"qf": "sName^3 sAddress^0.8 sDesc^0.5",

搜索:绿地 中央

1、搜索相关参数为:

   "params": {

     "q": "绿地 中央",

     "defType": "edismax",

     "indent": "true",

     "qf": "sName^3  sAddress^0.8 sDesc^0.5",

     "fl": "sName  sAddress sDesc",

     "rows": "3",

     "wt": "json",

     "lowercaseOperators": "true",

     "debugQuery": "true",

     "stopwords": "true",

     "_": "1482890508314"

    }

2Solr 内部拼接的实际查询字符串为:

"parsedquery_toString":"+((sDesc:绿地^0.5 | sAddress:绿地^0.8 | sName:绿地^3.0) (sDesc:中央^0.5 | sAddress:中央^0.8 | sName:中央^3.0))",

 

说明:  1(sDesc:绿地^0.5 | sAddress:绿地^0.8 | sName:绿地^3.0)   含义是 “绿地“ 在三个字段(sName  sAddress sDesc 中以 or 的关系有匹配,即至少匹配一个;

              2(sDesc:中央^0.5 | sAddress:中央^0.8 | sName:中央^3.0))  含义是 “中央“ 在三个字段(sName  sAddress sDesc 中以 or 的关系有匹配,即至少匹配一个;

3( (sDesc:绿地^0.5 | sAddress:绿地^0.8 | sName:绿地^3.0)  (sDesc:中央^0.5 | sAddress:中央^0.8 | sName:中央^3.0) ) 含义是 “绿地“,”中央“在三个字段(sName  sAddress sDesc 中以 and的关系匹配,两端都必须匹配上;

 

 

3、针对此搜索结果,对 id225854-1 的结果进行得分解析

"225854-1":"\n

 

        3.842088 = (MATCH) sum of:\n    //得分为3.842088=1.9787676(绿地匹配到的最大得分)+1.8633204(中央匹配到的最大得分)

        

                 1.9787676 = (MATCH) max of:\n  //此为绿地匹配到的最大得分

 

                                 //以下为绿地 sDesc字段中的得分

0.03285972 =(MATCH) weight(sDesc:绿地^0.5 in 30960) [DefaultSimilarity], resultof:\n      0.03285972 = score(doc=30960,freq=3.0),product of:\n        0.07589993 =queryWeight, productof:\n          0.5 = boost\n         3.9992807 = idf(docFreq=8143,maxDocs=163459)\n         0.03795679 = queryNorm\n        0.43293482 =fieldWeight in 30960, productof:\n          1.7320508 =tf(freq=3.0), with freqof:\n            3.0 =termFreq=3.0\n          3.9992807= idf(docFreq=8143,maxDocs=163459)\n          0.0625= fieldNorm(doc=30960)\n  

 //以下为绿地 sName字段中的得分

1.9787676 = (MATCH)weight(sName:绿地^3.0 in 30960) [DefaultSimilarity], resultof:\n      1.9787676 = score(doc=30960,freq=1.0),product of:\n        0.7176517 =queryWeight, product of:\n         3.0 = boost\n          6.302357 =idf(docFreq=813, maxDocs=163459)\n         0.03795679 = queryNorm\n        2.7572813 =fieldWeight in 30960, productof:\n          1.0 = tf(freq=1.0),with freqof:\n            1.0 =termFreq=1.0\n          6.302357 =idf(docFreq=813,maxDocs=163459)\n          0.4375= fieldNorm(doc=30960)\n 

//根据绿地在  sDescsName 中的得分 得到最大得分为1.9787676

注意:由于我们还指定了sAddress这个字段,但是在上面没有体现出来,这是因为在sAddress 字段中没有找到 “绿地“此字,所以这里没有出现此字段的相关得分。

 

//以下为中央的搜索得分,原理与绿地一至  

               1.8633204 = (MATCH) max of:\n

        

0.024355564 =(MATCH) weight(sDesc:中央^0.5 in 30960) [DefaultSimilarity], resultof:\n      0.024355564 = score(doc=30960,freq=2.0),product of:\n        0.07231549 =queryWeight, product of:\n         0.5 = boost\n          3.8104115 =idf(docFreq=9836,maxDocs=163459)\n          0.03795679= queryNorm\n        0.33679596 =fieldWeight in 30960, productof:\n          1.4142135 =tf(freq=2.0), with freq of:\n           2.0 = termFreq=2.0\n         3.8104115 = idf(docFreq=9836,maxDocs=163459)\n          0.0625= fieldNorm(doc=30960)\n   

1.8633204 =(MATCH) weight(sName:中央^3.0 in 30960) [DefaultSimilarity], resultof:\n      1.8633204 = score(doc=30960,freq=1.0),product of:\n        0.69640213 =queryWeight, product of:\n         3.0 = boost\n         6.115745 = idf(docFreq=980, maxDocs=163459)\n         0.03795679 = queryNorm\n        2.6756384 =fieldWeight in 30960, productof:\n          1.0 = tf(freq=1.0),with freqof:\n            1.0 =termFreq=1.0\n          6.115745 =idf(docFreq=980, maxDocs=163459)\n         0.4375 = fieldNorm(doc=30960)\n"

 

*******************************************************************************************************************************************************************************************

以上为基于原solr库进行的查询,我们这边新搭建的solr库也是如此,对solr底层原理研究,此是lucence底层打分规则;

 

个人拙见:

1)针对多词问题:

此方法的合理性是明显的;

如果采用 累加算法,

示例:

 文档编号

sName

sAddress

sDesc

1

万科

万科

万科

2

万科

富力红树湾

绿地

 

例如 :在字段sName  sAddress sDesc ,中搜索 “万科 绿地“,假设匹配到,则得分为1

1: 假设采用 累加算法 ,则

    文档 1,万科在三个字段中匹配三次,绿地匹配0次,累计得分为 3

    文档2,万科在三个字段中匹配一次,绿地匹配1此,累计得分为2

   根据score从大到小排序,则文档顺序为 1,2 。所以此不符合我们预期

 

2: 假设采用 lucence算法 ,则

    文档 1,万科在三个字段中匹配三次,最大得分为1分,绿地匹配0次,则总得分为 1

    文档2,万科在三个字段中匹配一次,最大得分1分,绿地匹配1此,则总得分为2

   根据score从大到小排序,则文档顺序为 2,1 。所以此较符合我们预期。

 

2)针对单词问题:

例如 :在字段sName  sAddress sDesc ,中搜索 “万科“,假设匹配到,则得分为1

 

   1: 假设采用 lucence算法 ,则

    文档 1,万科在三个字段中匹配三次,最大得分为1分,则总得分为 1

    文档2,万科在三个字段中匹配一次,最大得分1分,则总得分为1

   根据score从大到小排序,则文档顺序为 21 并列 。所以此不符合我们预期。

 

2:假设采用 累加算法 ,则

    文档 1,万科在三个字段中匹配三次,累计得分为 3

    文档2,万科在三个字段中匹配一次,累计得分为1

   根据score从大到小排序,则文档顺序为 1,2 。所以此符合我们预期

*****************************************************************************************

建议:

所以根据以上所说问题,单个词时,如果基于lucence打分明显不符合我们预期,这边技术可以实现针对,单词时相似度得分可以采用累加;

如果为多词时,建议还是采用 lucence 底层规则计算
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值