Solr函数查询:如何使用"score"字段创建自定义评分

Uts*_*v T 9 lucene solr function-query

经过广泛搜索并遇到诸如此类的答案 -

Solr:按分数和int字段值排序

使用函数查询在Solr中提升分数

我仍然无法解决以下问题:

如何使用文档的"得分"字段创建新的评分函数并相应地对结果进行排名.像这样的东西 -

new_score =得分*my_other_field

当前查询 -

http://localhost:8984/solr/suggest_new/select?q=tom&wt=json&indent=true&bq=_val_:"product(score,count_of_searches)"
Run Code Online (Sandbox Code Playgroud)

这是我在Elasticsearch中所做的事情 -

"script_score" : {
    "script" : "_score * doc['my_numeric_field'].value"
}
Run Code Online (Sandbox Code Playgroud)

请帮助/指出正确的链接.非常感谢 !(注:Solr版本:4.10.4)

che*_*ffe 8

使用Dismax或eDismax时,您应该只需使用字段bf(Boost Functions)参数,并使用数字字段的名称填充它.

我有一个索引文件,其中包含一个名为first_publication_year的数值.当我*:*对我的索引运行matchAllQuery时,所有文档都会得到1分.这使得bf参数的效果更容易看到,因为1是一个简单的除数.然而,样本将随同任何查询一起使用.

/select?q=*:*
Run Code Online (Sandbox Code Playgroud)

结果

{
  "responseHeader": {
    "status": 0,
    "QTime": 1
  },
  "response": {
    "numFound": 10007277,
    "start": 0,
    "maxScore": 1,
    "docs": [
      {
        "first_publication_year": 2002,
        "score": 1
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想基于该字段提升文档,因此我将该字段名称添加为bf参数

/select?q=*:*&bf=first_publication_year
Run Code Online (Sandbox Code Playgroud)

结果

{
  "responseHeader": {
    "status": 0,
    "QTime": 1
  },
  "response": {
    "numFound": 10007277,
    "start": 0,
    "maxScore": 1425.5273,
    "docs": [
      {
        "first_publication_year": 2015,
        "score": 1425.5273
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您认为提升太微弱,您可以使用函数查询进行调整.此示例将第一个出版年份与10相乘.

/select?q=*:*&bf=product(first_publication_year,10)
Run Code Online (Sandbox Code Playgroud)

结果

{
  "responseHeader": {
    "status": 0,
    "QTime": 465
  },
  "response": {
    "numFound": 10007277,
    "start": 0,
    "maxScore": 14248.908,
    "docs": [
      {
        "first_publication_year": 2015,
        "score": 14248.908
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

参考

Solr参考手册中也记录了这一点.

bf(Boost函数)参数

bf参数指定将用于构造FunctionQueries的函数(带有可选的boost),这些函数将作为将影响分数的可选子句添加到用户的主查询中.可以使用Solr原生支持的任何函数以及增强值.例如:

recip(rord(myfield),1,2,3)^1.5
Run Code Online (Sandbox Code Playgroud)


小智 6

请使用query()函数获取“分数”的值。

因此,如果您要这样做new_score = score * Popularity,请使用以下格式。

q = searchterm&sort = product(query($ q),popularity) desc

query($ q)-返回查询的TF-IDF分数。因此,这等效于使用“得分”字段。