2017-03-06 6 views
1

Ich versuche, den Wert eines Dokuments entsprechend dem Wert eines Floating-Nummer-Felds aus dem Dokument zu erhöhen.So verwenden Sie eine Bewertungsfunktion in Solrj

Zum Beispiel kann der Benutzer nach „Olifanten namens ron, mit der Höhe zwischen 6 und 10 Metern“ und ich möchte das height Feld in einer Art und Weise abgefragt werden ähnlich ein DecayFunction.

In der folgenden vereinfachten Abfrage Ich erwarte, dass Olifanten nach Name und Höhe hat zurückzuholen, wo Höhe näher zu 8 Meter ist besser -

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

ich meine exponentiellen Zerfall Bewertungsfunktion unter Verwendung einer Kombination von entworfen haben math operands und regular 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)))))))) 

Nun möchte Ich mag diese Funktion in die Abfrage Punktzahl zu übernehmen, die _val_magic field verwenden.

Wie kann ich dies in Solrj erreichen?

Welche anderen Möglichkeiten gibt es (statt), dies zu tun?

{p.s. - Ich verwende den Standardabfrageparser, in Solr 5.3.1}

+0

Können Sie bitte die tatsächliche Abfrage hinzufügen damit wir genau wissen, wie es geht. Was ist das erwartete Ergebnis? Kannst du ein einfaches Beispiel geben? –

+0

Ich habe beides gemacht. lassen Sie mich wissen, ob das hilft – selotape

Antwort

2

Ich endete damit, indem ich eine benutzerdefinierte luscene.search.Query implementierte. Im Folgenden ist eine Zusammenfassung der Klasse und ihre Verwendung -

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); 
    } 
} 

ich die Klasse, die von seiner toString(field) im „q“ Parameter eines solrj.SolrQuery setzen -

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