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

时间:2016-04-25 10:54:35

标签: solr lucene function-query

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

Solr: Sort by score & an int field value

Use function query for boosting score in 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)"

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

"script_score" : {
    "script" : "_score * doc['my_numeric_field'].value"
}

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

3 个答案:

答案 0 :(得分:8)

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

示例

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

/select?q=*:*

结果

{
  "responseHeader": {
    "status": 0,
    "QTime": 1
  },
  "response": {
    "numFound": 10007277,
    "start": 0,
    "maxScore": 1,
    "docs": [
      {
        "first_publication_year": 2002,
        "score": 1
      }
    ]
  }
}

现在我想根据该字段提升文档,因此我将该字段名称添加为bf parameter

/select?q=*:*&bf=first_publication_year

结果

{
  "responseHeader": {
    "status": 0,
    "QTime": 1
  },
  "response": {
    "numFound": 10007277,
    "start": 0,
    "maxScore": 1425.5273,
    "docs": [
      {
        "first_publication_year": 2015,
        "score": 1425.5273
      }
    ]
  }
}

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

/select?q=*:*&bf=product(first_publication_year,10)

结果

{
  "responseHeader": {
    "status": 0,
    "QTime": 465
  },
  "response": {
    "numFound": 10007277,
    "start": 0,
    "maxScore": 14248.908,
    "docs": [
      {
        "first_publication_year": 2015,
        "score": 14248.908
      }
    ]
  }
}

<强>参考

the Solr Reference Manual中也记录了这一点。

  

bf(增强功能)参数

     

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

recip(rord(myfield),1,2,3)^1.5

答案 1 :(得分:4)

使用query()函数来获取'score'的值。

因此,如果您正在尝试此操作: new_score =得分*受欢迎程度,请使用以下格式。

q = searchterm&amp; sort = product(查询($ q),受欢迎程度) desc

query($ q) - 返回查询的TF-IDF分数。所以这相当于使用'得分'字段。

答案 2 :(得分:1)

我认为您应该为Solr文档进行索引时间提升。您需要为文档添加可选的boost属性。 如果您使用的是SolrJ,则可以使用document.setDocumentBoost(x)以x的提升因子来提升文档

您还可以按照this链接获取Solr文档索引和查询时间提升的详细说明。