You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenSearch Java客户端中结合BoolQuery与script_score查询?

OpenSearch Java客户端:替换ScriptScoreQuery中的MatchAll为BoolQuery的解决方案

问题说明

你基于OpenSearch官方的ScriptScoreQuery示例代码,尝试将其中的matchAll查询替换为自定义的BoolQuery(包含价格范围过滤),但在传入BoolQueryBuilder到scriptScore的query参数时出现编译错误,期望生成的查询DSL如下:

GET /my_index/_search
{
  "query": {
    "script_score": {
      "query": {
        "bool": {
          "filter": {
            "bool": {
              "must": [
                {
                  "range": {
                    "price": {
                      "gte": 200,
                      "lte": 350
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "script": {
        "source": "knn_score",
        "lang": "knn",
        "params": {
          "field": "my_vector",
          "query_value": [1.5, 5.5, 4.5, 6.4],
          "space_type": "cosinesimil"
        }
      }
    }
  }
}

错误原因

编译错误的核心是API类型不兼容:你使用的BoolQueryBuilder属于旧版High Level Rest Client(HLRC)的API,而官方示例采用的是OpenSearch新Java客户端(基于Apache HttpClient 5)的Query构建器体系,两套API的类无法直接混用。

正确实现代码

需要使用新客户端的BoolQuery.Builder来构建Bool查询,而非旧版的BoolQueryBuilder:

第一步:构建符合新客户端规范的BoolQuery

// 构建内部的BoolQuery(包含价格范围条件)
BoolQuery innerBoolQuery = new BoolQuery.Builder()
        .must(new RangeQuery.Builder()
                .field("price")
                .gte(JsonData.of(200))
                .lte(JsonData.of(350))
                .build())
        .build();

// 构建外层的BoolQuery(包含filter)
BoolQuery boolQuery = new BoolQuery.Builder()
        .filter(innerBoolQuery)
        .build();

第二步:将BoolQuery整合到ScriptScoreQuery中

将上述构建好的BoolQuery包装为Query对象后,传入ScriptScoreQuery.Builder的query参数:

InlineScript inlineScript = new InlineScript.Builder()
        .source("knn_score")
        .lang("knn")
        .params(Map.of(
                "field", JsonData.of("my_vector"),
                "query_value", JsonData.of(List.of(1.5, 5.5, 4.5, 6.4)),
                "space_type", JsonData.of("cosinesimil")
        ))
        .build();

// 构建最终的ScriptScoreQuery
Query query = new Query.Builder()
        .scriptScore(new ScriptScoreQuery.Builder()
                .query(new Query.Builder()
                        .bool(boolQuery) // 传入构建好的BoolQuery
                        .build())
                .script(new Script.Builder()
                        .inline(inlineScript)
                        .build())
                .build())
        .build();

// 构建搜索请求并执行
SearchRequest searchRequest = new SearchRequest.Builder()
        .index("my_index")
        .query(query)
        .build();

SearchResponse<JsonNode> searchResponse = client.search(searchRequest, JsonNode.class);

说明

这段代码完全基于OpenSearch新Java客户端的Builder API,类型匹配正确,编译运行后会生成你期望的查询DSL。

内容的提问来源于stack exchange,提问作者Gengis Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:35:37