【问题标题】:How to properly use a scoring function in Solrj如何在 Solrj 中正确使用评分功能
【发布时间】:2017-07-26 05:06:03
【问题描述】:

我正在尝试根据文档中浮点数字段的值来提高文档的分数。

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

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

q=name:"ron" _val_:"div(1,abs(sub(height,8)))"

我已经使用 math operandsregular functions 的组合起草了我的指数衰减评分函数 -

exp(sub(0,div(pow(max(0,sub(abs(sub(value,origin)),offset)),2),mul(2,sub(0,div(pow(scale,2),mul(2,ln(decay))))))))

现在我想使用 _val_ magic field 将此函数合并到查询分数中。

如何在 Solrj 中完成此操作?

还有哪些其他方式(而不是_val_)可以做到这一点?

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

【问题讨论】:

  • 您能否添加实际查询,以便我们确切知道您的方式是什么。另外,预期的结果是什么?能举个简单的例子吗?
  • 我都做了。让我知道这是否有帮助

标签: java solr solrj solr5


【解决方案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(field) 放在solrj.SolrQuery 的“q”参数中来使用该类 -

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 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2018-03-14
    • 2014-12-31
    • 2016-04-13
    • 2020-10-26
    • 2019-09-28
    • 1970-01-01
    相关资源
    最近更新 更多