solr的评分机制、重新排序,作者也正在研究中,变工作边学习当中,欢迎拍砖。
为什么要使用FunctionQuery
按照solr wiki文中的描述, 函数查询 让我们可以利用 numeric域的值 或者 与域相关的的某个特定的值的函数,来对文档进行评分。
实际中的运用
简单需求solr提供sort功能即可完成。
但是如果需要多个维度进行评分排序的时候,我们就需要使用FuctionQuery进行评分。
举一个例子,电商类网站(比如淘宝)的商品搜索:
1.在商品名称上出现搜索关键字排序靠前,而内容的次之
2.对多皇冠的买家排序靠前等
3.对近期发布的商品排序靠前
4.对最近销售多商品靠前
综上获得一个综合排名
具体示例参考:重新评分排序示例
dismax和edismax
dimax和edismax对应的是两种查询解析plguin:DisMax 查询解析器,扩展 DisMax 查询解析器(eDisMax)。
两者的不同可以参数以下两篇文章:
solr 的edismax与dismax比较与分析
Solr Dismax示例
做了一些基本的测试
参数:
defType=dismax&bf=sum(div(sales,1))&fl=score
结果:
"response":{
"numFound":25,"start":0,"maxScore":25.43906,"docs":[
{
"score":25.43906},
{
"score":22.43906},
{
"score":12.43906},
{
"score":12.43906},
{
"score":12.43906},
{
"score":12.072939},
{
"score":11.072939},
{
"score":10.43906},
{
"score":8.43906},
{
"score":8.072939}]
},
- fl: 是逗号分隔的列表,用来指定文档结果中应返回的 Field 集。默认为 “*”,指所有的字段
- defType: 指定query parser,常用defType=lucene, defType=dismax, defType=edismax
- qf: query fields,指定solr从哪些field中搜索。可以设置升降因子,如:qf=name^1.0
pf: 用于指定一组field,当query完全匹配pf指定的某一个field时,来进行boost。
参数中sum div具体代表什么含义,可以参照:
solr评分函数的中文解释
当然也可以看官方的wiki 都有详细说明。
结果是如何得到的呢?
首先我们看到lucene的评分机制
原文出处:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html