Как правильно использовать функцию подсчета очков в Solrj

Я пытаюсь повысить оценку документа в соответствии со значением поля с плавающим числом из документа.

Например, пользователь может искать "Олифунты по имени Рон, с высотой от 6 до 10 метров", и я хотел бы запросить height поле в манере, схожей с функцией распада.

В следующем упрощенном запросе я ожидаю получить олифонты, набранные по имени и высоте, где высота ближе к 8 метрам - лучше

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

Я разработал свою функцию оценки экспоненциального убывания, используя комбинацию математических операндов и обычных функций -

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_ волшебное поле.

Как я могу сделать это в Solrj?

Какие еще способы есть (вместо _val_) сделать это?

{PS - я использую стандартный анализатор запросов, в Solr 5.3.1}

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) в параметре "q" solrj.SolrQuery -

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 ...
Другие вопросы по тегам