2016-04-13 8 views
0

Ich muss die folgende Abfrage von function_score mithilfe von Java-APIs implementieren. Ich konnte keine offizielle Dokumentation für function_score Abfrage in der Java-API-Abschnitt von Elasticsearch findenVerwendung von Elasticsearch FunctionScore-Abfrage mit Java-API

{ 
    "size": 40, 
    "query": { 
    "function_score": { 
     "functions": [ 
     { 
      "gauss": { 
      "location": { 
       "origin": { 
       "lat": 39.99606, 
       "lon": 116.480484 
       }, 
       "offset": "2km", 
       "scale": "3km" 
      } 
      } 
     } 
     ], 
     "score_mode": "sum", 
     "boost_mode": "replace", 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "range": { 
       "startTime": { 
        "from": "2016-04-12T12:00:00.000Z", 
        "to": "2016-04-12T16:00:00.000Z", 
        "include_lower": true, 
        "include_upper": true 
       } 
       } 
      }, 
      { 
       "range": { 
       "endTime": { 
        "from": "2016-04-12T12:00:00.000Z", 
        "to": "2016-04-12T16:00:00.000Z", 
        "include_lower": true, 
        "include_upper": true 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

ich die Java-API verwenden, wie diese

RangeQueryBuilder queryStartDate = QueryBuilders.rangeQuery("startTime").gte(param.getStartTime()) 
       .lte(param.getEndTime()); 

     RangeQueryBuilder queryEndDate = QueryBuilders.rangeQuery("endTime").gte(param.getStartTime()) 
       .lte(param.getEndTime()); 

// query 
QueryBuilder querys = QueryBuilders.boolQuery().must(queryStartDate).must(queryEndDate); 

// function 
Map<String, Double> locationMap = new HashMap<String, Double>(); 
     locationMap.put("lat", param.getLat()); 
     locationMap.put("lon", param.getLng()); 
     ScoreFunctionBuilder sfb2 = ScoreFunctionBuilders.gaussDecayFunction("location", locationMap, "1km") 
       .setOffset("2km"); 

//function_score 
FunctionScoreQueryBuilder sa = new FunctionScoreQueryBuilder().boostMode("replace").add(sfb2); 

//final search 
SearchResponse response = client.prepareSearch().setIndices("film").setTypes("data").setQuery(sa) 
       .setQuery(querys).setSize(40).execute().actionGet(); 

aber nicht

Antwort

2

Sie Dosis arbeiten müssen

FunctionScoreQueryBuilder fqBuilder = QueryBuilders.functionScoreQuery(querys); 
    fqBuilder.boostMode(CombineFunction.REPLACE); 
    fqBuilder.scoreMode(ScoreMode.Sum.name().toLowerCase()); 
    fqBuilder.add(sfb2); 
    SearchResponse response = client.prepareSearch().setIndices("film").setTypes("data").setQuery(fqBuilder).setSize(40).execute().actionGet(); 
+0

Vielen Dank für Ihre Hilfe, es funktioniert, und ich möchte wissen, wie Sie die elasticsearch java-api Dokumentation finden? Ich kann die offizielle Dokumentation nicht finden, etwas wie CombineFunction.REPLACE, ich kenne den const-Parameter überhaupt nicht ... – kevin

+0

Wenn Sie nur das api doc ansehen, können Sie es leicht finden. Schauen Sie einfach in die Klasse und Sie werden eine API mit Signatur finden: public FunctionScoreQueryBuilder boostMode (CombineFunction combineFunction) – Rahul

Verwandte Themen