SOLR пользовательская функция запроса выдает ошибку - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь отсортировать в порядке возрастания пару документов.В моем документе есть поле с именем "price", по которому я хочу выполнить сортировку.Я использую пользовательскую стратегию функции solr.

Команда поля сортировки SOLR: mySuggestRankingFunc (цена) desc

mySuggestRankingFunc (цена): этопользовательская функция solr, которая возьмет поле (здесь я звоню с price ) и просто вернет значение этого поля (пока что это простая реализация)

price:поле, значение которого я хочу, чтобы функция возвращала. (FLOAT)

// Моя реализация ValueSourceParser

public class MyValueSourceParser extends ValueSourceParser {
    public void init(NamedList namedList) {
    }
    public ValueSource parse(FunctionQParser fqp) throws SyntaxError {
        // Trying to get the field 
         String field = fqp.parseArg(); 
         // Passing the field to my custom ValueSource class
         return new PriceFieldSource(field);
    }
}

// Реализация PriceFieldSource

import org.apache.log4j.Logger;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.search.IndexSearcher;

import java.io.IOException;
import java.util.Map;

public class PriceFieldSource extends ValueSource {
    Logger logger = Logger.getLogger(PriceFieldSource.class);

    final ValueSource source;
    final String field;
    public PriceFieldSource(ValueSource source, String field) {
        this.source = source;
        this.field = field;
    }
    public FunctionValues getValues(Map context, LeafReaderContext reader) throws IOException {

        return new FunctionValues() {
            public float floatVal(int doc) {
                return 1.0f; 
            // Want to return the value of price field from here.
            }
            public int intVal(int doc) {
                return (int)floatVal(doc);
            }
            public long longVal(int doc) {
                return (long)floatVal(doc);
            }
            public double doubleVal(int doc) {
                return (double)floatVal(doc);
            }
            public String strVal(int doc) {
                return Float.toString(floatVal(doc));
            }
            public String toString(int doc) {
                return description();
            }
        };
    }

    @Override
    public boolean equals(Object o) {
        return false;
    }

    @Override
    public int hashCode() {
        return 0;
    }

    @Override
    public String description() {
        return "price";
    }

    @Override
    public void createWeight(Map context, IndexSearcher searcher) throws IOException {
       super.createWeight(context, searcher);
    }
}

Ошибка от solr:

{   "responseHeader":{
    "status":400,
    "QTime":1,
    "params":{
      "q":"*:*",
      "sort":"mySuggestRankingFunc(price) desc",
      "_":"1528698673642"}},   "error":{
    "metadata":[
      "error-class","org.apache.solr.common.SolrException",
      "root-error-class","org.apache.solr.search.SyntaxError"],
    "msg":"sort param could not be parsed as a query, and is not a field that exists in the index: mySuggestRankingFunc(price)",
    "code":400}}

Пожалуйста, помогите !!

...