solr score打分模式及其问题
2016-12-28 13:39
218 查看
在新房索引实例中,根据"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"
}
2、Solr
内部拼接的实际查询字符串为:
"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、针对此搜索结果,对
id为225854-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
//根据绿地在
sDesc,sName
中的得分
得到最大得分为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,
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从大到小排序,则文档顺序为
2和1
并列
。所以此不符合我们预期。
2:假设采用
累加算法
,则
文档
1,万科在三个字段中匹配三次,累计得分为 3
文档2,万科在三个字段中匹配一次,累计得分为1
根据score从大到小排序,则文档顺序为
1,2 。所以此符合我们预期
*****************************************************************************************
建议:
所以根据以上所说问题,单个词时,如果基于lucence打分明显不符合我们预期,这边技术可以实现针对,单词时相似度得分可以采用累加;
如果为多词时,建议还是采用lucence底层规则计算
在新房索引实例中,根据"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"
}
2、Solr
内部拼接的实际查询字符串为:
"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、针对此搜索结果,对
id为225854-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
//根据绿地在
sDesc,sName
中的得分
得到最大得分为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,
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从大到小排序,则文档顺序为
2和1
并列
。所以此不符合我们预期。
2:假设采用
累加算法
,则
文档
1,万科在三个字段中匹配三次,累计得分为 3
文档2,万科在三个字段中匹配一次,累计得分为1
根据score从大到小排序,则文档顺序为
1,2 。所以此符合我们预期
*****************************************************************************************
建议:
所以根据以上所说问题,单个词时,如果基于lucence打分明显不符合我们预期,这边技术可以实现针对,单词时相似度得分可以采用累加;
如果为多词时,建议还是采用lucence底层规则计算
相关文章推荐
- P2P研究:主要应用模式及其现存问题
- 【原创】cs+html+js+css模式(七): 顺序执行与并发执行问题,IIS7及其以上版本的抛错问题解决
- P2P研究:主要应用模式及其现存问题概要
- C++技术问题总结-第14篇 常用设计模式及其应用场景
- Oracle启动模式及其常见问题探讨
- KandQ:单例模式的七种写法及其相关问题解析
- KandQ:单例模式的七种写法及其相关问题解析
- B2C模式下的电子商务模式及其物流问题
- Java串口通信的通用模式及其问题
- 关于数据库被锁定的问题及其解决方案
- IoC模式的类型及其实现
- vc部分问题及其解决方法
- 困惑中:remoting技术在服务器端激活的HTTP通道模式下,碰到的奇怪问题。
- decorator模式使用中遭遇继承与聚合的冲突问题
- Struts+Hibernate模式: jsp->servlet->session bean->DAO->Hibernate->Database 各层面的功能及其实现
- 关于设计模式系列的文章问题
- JM8.5中的7种宏块模式问题
- 使用Apache Axis部署 Web服务时的常见问题及其解决方法
- 使用Apache Axis部署 Web服务时的常见问题及其解决方法
- 应聘Java笔试时可能出现问题及其答案