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

标签 elasticsearch java

我需要使用 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
                }
              }
            }
          ]
        }
      }
    }
  }
}

我像这样使用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();

但是它不起作用

最佳答案

在 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

关于elasticsearch - 如何使用 Java API 使用 Elasticsearch FunctionScore 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36589645/

相关文章:

java - 如何用Java创建一个桶填充?

php - 不能在同一必须过滤条件中包含一个字词和geo_distance_range

search - 如何获得 Elasticsearch 以在尖括号内返回结果?

java - Weblogic 12c部署错误: unsupported classversion 52. 0

java - 使用 java 8 迭代和过滤两个列表

java - 获取一个字符串并在前面放置一个标准文本

用于创建音频 CD 磁盘镜像的 Java 库

postgresql - 搜索土耳其语字符

elasticsearch - Kibana 5.6.3中的日期范围查询不适用于@timestamp

elasticsearch - 在生产中使用ElasticSearch 5 alpha安全吗?