2016-04-13 20 views
0

Java APIを使用して以下のfunction_scoreクエリを実装する必要があります。私はこのJava APIを使用したElasticsearch FunctionScoreクエリの使用方法

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

のようなJava APIを使用しelasticsearch

{ 
    "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 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

のJava APIのセクションでfunction_scoreクエリのための任意の公式ドキュメントを見つけることができなかったが、それは

答えて

2

あなたが必要と動作しない線量次のようにFunctionScoreQueryBuilderにクエリを追加してください。

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

私を助けてくれてありがとう、それは動作し、私はelasticsearch java-apiのドキュメントを見つける方法を知りたいですか?私は、コンビネーションファンクションのような公式のドキュメントを見つけることができません.REPLACE、私もconstパラメータを知らない... – kevin

+0

あなたは単にAPIドックを見れば、それを簡単に見つけることができます。クラスを調べると、署名付きのAPIが見つかります:public FunctionScoreQueryBuilder boostMode(CombineFunction combineFunction) – Rahul