如何在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
相关产品推荐
相关产品推荐

