2017-03-06 4 views
1

私は文書の浮動小数点フィールドの値に従って文書のスコアを上げようとしています。Solrjで採点関数を正しく使うには

例えば、ユーザは、「6と10メートルの間の高さと、ロン名前Oliphaunts」を検索することができると私はDecayFunctionに類似した方法でheightフィールドを照会したいです。近い8メートルの高さが優れている、私は名前や高さによって得点oliphauntsを取得することを期待以下の単純化されたクエリでは、

-

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で標準クエリパーサを使用しています。

+0

- 私はsolrj.SolrQueryの「Q」パラメータでそのtoString(field)を置くことによって、クラスを使用

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

私たちはあなたの道が何であるかを正確に知っています。また、期待される結果は何ですか?簡単な例がありますか? –

+0

私は両方をしました。それが役に立ったら教えてください – selotape

答えて

2

私は結局これを実現するには、カスタムluscene.search.Queryを実装してください。以下は、クラスとその使用方法の概要です - あなたは、実際のクエリを追加してくださいすることができ

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 ... 
関連する問題