如何使用Elasticsearch Java API实现含knn的script_score查询
以下是你给出的Elasticsearch查询DSL对应的Java High Level REST Client实现代码:
前置要求
确保你的项目引入了和集群版本一致的Elasticsearch Java High Level REST Client依赖,且集群已开启KNN相关功能支持。
完整实现代码
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.TermQueryBuilder; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.ScriptScoreQueryBuilder; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.util.HashMap; import java.util.Map; // 以下为业务代码片段 public class EsKnnQueryDemo { public void queryDemo(RestHighLevelClient restHighLevelClient) throws Exception { // 1. 构建过滤条件:匹配color为RED的文档 TermQueryBuilder colorFilter = QueryBuilders.termQuery("color", "RED"); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().filter(colorFilter); // 2. 构建KNN打分脚本 Map<String, Object> scriptParams = new HashMap<>(); scriptParams.put("field", "my_binary"); scriptParams.put("query_value", "iiQ1QDEABAA="); scriptParams.put("space_type", "hammingbit"); Script knnScript = new Script(ScriptType.INLINE, "knn", "knn_score", scriptParams); // 3. 封装ScriptScore查询 ScriptScoreQueryBuilder scriptScoreQuery = QueryBuilders.scriptScoreQuery(boolQuery, knnScript); // 4. 构建搜索请求,指定返回条数为2 SearchRequest searchRequest = new SearchRequest("my-index"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.size(2); sourceBuilder.query(scriptScoreQuery); searchRequest.source(sourceBuilder); // 5. 执行查询,同步执行用search方法,异步可调用searchAsync方法 SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); // 后续处理返回结果逻辑 } }
注意事项
- 代码中的
restHighLevelClient为提前初始化完成的客户端实例,需确保集群地址、身份认证等配置和实际环境匹配 - 如果你使用的是Elasticsearch 8.x版本的新Java客户端,核心查询参数逻辑和上述代码一致,仅API调用写法略有调整
内容的提问来源于stack exchange,提问作者Raghawendra singh
相关产品推荐
相关产品推荐

