Java 如何在Solrj中正确使用计分功能

Java 如何在Solrj中正确使用计分功能,java,solr,solrj,solr5,Java,Solr,Solrj,Solr5,我试图根据文档中浮点数字段的值来提高文档的分数 例如,用户可以搜索名为ron的Oliphaunts,高度在6到10米之间,我想以类似于搜索的方式查询高度字段 在下面的简化查询中,我希望检索按名称和高度评分的oliphaunts,其中接近8米的高度更好- q=name:"ron" _val_:"div(1,abs(sub(height,8)))" 我已经用和的组合起草了指数衰减评分函数- 现在,我想使用_val_2;将此函数合并到查询分数中 我如何在Solrj中实现这一点 除此之外还有什么其他方

我试图根据文档中浮点数字段的值来提高文档的分数

例如,用户可以搜索名为ron的Oliphaunts,高度在6到10米之间,我想以类似于搜索的方式查询高度字段

在下面的简化查询中,我希望检索按名称和高度评分的oliphaunts,其中接近8米的高度更好-

q=name:"ron" _val_:"div(1,abs(sub(height,8)))"
我已经用和的组合起草了指数衰减评分函数-

现在,我想使用_val_2;将此函数合并到查询分数中

我如何在Solrj中实现这一点

除此之外还有什么其他方法


{p.s.-我正在使用标准查询解析器,在Solr 5.3.1}

中,我通过实现一个定制的lucene.search.query来完成这项工作。以下是该类别及其用法的摘要-

package org.example.ronvisbord.solr.queries.custom;

import org.apache.lucene.search.Query;

public class HeightFunctionQuery extends Query {

    private final String queryTemplate = "(_val_:\"%s\")^%f";
    private final String functionTemplate = "div(1,abs(sub(%s,%d)))";
    private double boost;

    @Override
    public String toString(String field) {
        return String.format(queryTemplate, createFunction(field), boost);
    }

    public HeightFunctionQuery(double boost, int targetHeight) {
        this.boost = boost;
        this.targetHeight = targetHeight;
    }

    private String createFunction(String field) {
        return String.format(functionTemplate, field, targetHeight);
    }
}
我通过将toString字段放在solrj.SolrQuery的q参数中来使用该类-


请您添加实际查询,以便我们确切了解您的方式。还有,预期的结果是什么?你能举个简单的例子吗?我两者都做了。如果有帮助,请告诉我
package org.example.ronvisbord.solr.queries.custom;

import org.apache.lucene.search.Query;

public class HeightFunctionQuery extends Query {

    private final String queryTemplate = "(_val_:\"%s\")^%f";
    private final String functionTemplate = "div(1,abs(sub(%s,%d)))";
    private double boost;

    @Override
    public String toString(String field) {
        return String.format(queryTemplate, createFunction(field), boost);
    }

    public HeightFunctionQuery(double boost, int targetHeight) {
        this.boost = boost;
        this.targetHeight = targetHeight;
    }

    private String createFunction(String field) {
        return String.format(functionTemplate, field, targetHeight);
    }
}
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.SolrClient;
import org.example.ronvisbord.solr.queries.custom.HeightFunctionQuery;
import org.apache.lucene.search.Query;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.response.QueryResponse;

...

    double boost = 10.0;
    double targetHeight = 8;
    String heightField = "height";

    Query heightQuery = new HeightFunctionQuery(targetHeight, boost);
    SolrQuery solrQuery = new SolrQuery();
    solrQuery.set("q", heightQuery.toString(heightField));
    // ... further configure the solrQuery ...

    SolrClient client = new HttpSolrClient("http://solr_host:8983/solr/core")
    QueryResponse response = client.query(query, SolrRequest.METHOD.POST)
    // ... process results ...