在新房索引实例中,根据"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 底层规则计算