Как правильно использовать функцию подсчета очков в 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 ...