我正在执行Solr搜索,搜索顺序不是基于分数显示的。让我们说,如果使用搜索关键字作为.net ios,它将返回基于分数的结果。我有一个字段标题,它保存了以下数据
KeySkills:Android,ios,Phonegap,ios
KeySkills:.net,.net,.net,MVC,
在这里,当我搜索.net ios作为搜索关键字net时,.net、.net、MVC、HTML、CSS在搜索结果中应该是第一位的,因为它包含了3次.net,所以分数应该更高,但我得到的结果正好相反。
是否需要在string文件或schema.xml文件中进行任何设置以实现这一目标,或者如何根据搜索字符串出现的最大值对结果进行排序。请帮我解决这个问题。
以下是我得到的结果
{
"responseHeader": {
"status": 0,
"QTime": 0,
"params": {
"indent": "true",
"q": ".net ios",
"_": "1434345788751",
"wt": "json"
}
},
"response": {
"numFound": 2,
"start": 0,
"docs": [
{
"KeySkills": "Android, ios, Phonegap, ios",
"_version_": 1504020323727573000,
"score": 0.47567564
},
{
"KeySkills": "net, net, net, MVC, HTML, CSS",
"_version_": 1504020323675144200,
"score": 0.4726259
}
]
}
}发布于 2015-06-15 07:48:14
正如您在卢塞内医生中所看到的,分数不仅仅是通过匹配项的数量来估算的:
score(q,d) = coord(q,d) · queryNorm(q) · ∑( tf(t in d)· idf(t)²·t.getBoost()·norm(t,d) )其中,tf(t in d)与术语的频率相关,定义为t项出现在当前得分文档d中的次数。 以色列国防军(T)代表反向文档频率。此值与docFreq的逆值(t项出现的文档数)相关。这意味着较少的术语给予更高的贡献,总得分。 coord(q,d)是一个基于在指定文档中找到多少查询项的得分因素。 t.getBoost()是查询文本中指定的查询Q中项t的搜索时间提升。 规范(t,d)封装了一些(索引时间)提升和长度因素:
当将文档添加到索引中时,所有上述因素都会被乘以。如果文档有多个名称相同的字段,则将它们的所有提升相乘在一起:
范数(t,d) = lengthNorm·∏f.boost()
所以,在这里,我猜"KeySkills": "Android, ios, Phonegap, ios"在其他文档之前,因为它包含的单词比另一个少。
要检查这一点,您可以使用这个很棒的工具,即explain.solr.pl。
https://stackoverflow.com/questions/30817689
复制相似问题