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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:45:04