如何使用 Java API 使用 Elasticsearch FunctionScore 查询

kev*_*vin 2 java elasticsearch

我需要使用 Java API 实现以下 function_score 查询。我在elasticsearch的Java API部分找不到任何关于function_score查询的官方文档

{
  "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
                }
              }
            }
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我像这样使用Java api

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();
Run Code Online (Sandbox Code Playgroud)

但它不起作用

小智 5

在 ElasticSearch 5.x 中,这一点已更改,FunctionScoreQueryBuilder.add()方法不再存在(已删除,未弃用)。此页面有一些示例:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-compound-queries.html#java-query-dsl-function-score-query