0

我正在实施 Solr 搜索,搜索顺序未根据分数显示。假设如果将搜索关键字用作.net ios,它会根据分数返回结果。我有一个包含以下数据的字段标题

关键技能:Android、ios、Phonegap、ios
关键技能:.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
  }
]
}
}
4

1 回答 1

0

正如您在Lucene 的文档中看到的那样,分数不仅是根据匹配项的数量来估计的:

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 中出现的次数。

idf(t)代表逆文档频率。该值与 docFreq 的倒数相关(出现术语 t 的文档数)。这意味着稀有术语对总分的贡献更高。

coord(q,d)是基于在指定文档中找到多少查询词的评分因子。

t.getBoost()是查询文本中指定的查询 q 中术语 t 的搜索时间提升。

norm(t,d)封装了一些(索引时间)提升和长度因子:

  • 场提升
  • lengthNorm 是在将文档添加到索引时根据文档中该字段的标记数计算的,因此较短的字段对分数的贡献更大。

将文档添加到索引时,上述所有因素都会相乘。如果文档有多个具有相同名称的字段,则它们的所有提升都相乘:

norm(t,d) = lengthNorm · ∏ f.boost()

所以,我想这"KeySkills": "Android, ios, Phonegap, ios"是在您的其他文档之前,因为它包含的单词比另一个文档少。

要检查这一点,您可以使用这个很棒的工具,即explain.solr.pl

于 2015-06-15T07:48:14.130 回答