您的位置:首页 > 其它

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
万科
万科
万科
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从大到小排序,则文档顺序为
2和1
并列
。所以此不符合我们预期。

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

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

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

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

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

建议:

所以根据以上所说问题,单个词时,如果基于lucence打分明显不符合我们预期,这边技术可以实现针对,单词时相似度得分可以采用累加;
如果为多词时,建议还是采用lucence底层规则计算
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: