我正在实施Solr搜索,搜索顺序不会根据得分显示。让我们说如果使用搜索关键字作为.net ios,它会根据得分返回结果。我有一个字段标题,其中包含以下数据
KeySkills:Android,ios,Phonegap,ios
KeySkills:.net,.net,.net,MVC,HTML,CSS
此处,当我搜索 .net ios 作为搜索关键字 net,.net,.net,MVC,HTML,CSS 应该在搜索结果中排在第一位且得分应该是更高,因为它包含.net 3次,但我得到相反的结果。
是否需要在solr配置文件或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
}
]
}
}
答案 0 :(得分:0)
正如您在Lucene's doc中所看到的,得分不仅仅通过匹配术语的数量进行估算:
score(q,d) = coord(q,d) · queryNorm(q) · ∑( tf(t in d)· idf(t)²·t.getBoost()·norm(t,d) )
其中 tf(t in d)与术语的频率相关,定义为数字 时间段t出现在当前评分的文件中。
idf(t)代表反向文档频率。该值相关 到docFreq的倒数(术语t的文档数量 出现)。这意味着更罕见的术语对总数的贡献更大 得分了。
coord(q,d)是基于有多少查询字词的分数因子 在指定的文件中找到。
t.getBoost()是查询q中术语t的搜索时间提升 在查询文本中指定。
norm(t,d)封装了一些 (索引时间)提升和长度因素:
- Field boost
- lengthNorm 当文档按照索引添加到索引时计算 文档中此字段的标记数,因此更短 字段对分数贡献更多。
将文档添加到索引时,以上所有因素都是 相乘。如果文档有多个具有相同名称的字段, 所有他们的提升成倍增加:
norm(t,d)= lengthNorm·Πf.boost()
所以,在这里,我想"KeySkills": "Android, ios, Phonegap, ios"
在你的另一个文件之前,因为它包含的文字少于另一文件。
要检查这一点,您可以使用这个很棒的工具,explain.solr.pl。