如何通过Java SDK分组检索Doc

本文介绍如何通过Java SDK在Collection中按分组进行相似性检索。

前提条件

接口定义

Java(JSP)

swift 复制代码
// class DashVectorCollection

// 同步接口
public Response<List<Group>> queryGroupBy(QueryDocGroupByRequest queryDocGroupByRequest);

// 异步接口
public ListenableFuture<Response<List<Group>>> queryGroupByAsync(QueryDocGroupByRequest queryDocGroupByRequest)

使用示例

**说明

  1. 需要使用您的api-key替换示例中的YOUR_API_KEY、您的Cluster Endpoint替换示例中的YOUR_CLUSTER_ENDPOINT,代码才能正常运行。

根据向量进行分组相似性检索

Java示例:

scss 复制代码
package com.aliyun.dashvector;

import com.aliyun.dashvector.models.Doc;
import com.aliyun.dashvector.models.Group;
import com.aliyun.dashvector.models.Vector;
import com.aliyun.dashvector.models.requests.CreateCollectionRequest;
import com.aliyun.dashvector.models.requests.InsertDocRequest;
import com.aliyun.dashvector.models.requests.QueryDocGroupByRequest;
import com.aliyun.dashvector.models.responses.Response;
import com.aliyun.dashvector.proto.CollectionInfo;
import com.aliyun.dashvector.proto.FieldType;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        DashVectorClientConfig config =
                DashVectorClientConfig.builder()
                        .apiKey("YOUR_API_KEY")
                        .endpoint("YOUR_CLUSTER_ENDPOINT")
                        .timeout(30f)
                        .build();
        DashVectorClient client = new DashVectorClient(config);

        CreateCollectionRequest request = CreateCollectionRequest.builder()
                .name("group_demo")
                .dimension(4)
                .metric(CollectionInfo.Metric.dotproduct)
                .dataType(CollectionInfo.DataType.FLOAT)
                .filedSchema("document_id", FieldType.STRING)
                .filedSchema("chunk_id", FieldType.INT)
                .build();

        Response<Void> createResponse = client.create(request);
        assert createResponse.isSuccess();

        DashVectorCollection collection = client.get("group_demo");
        assert collection.isSuccess();

        List<Doc> docs = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
            int finalI = i;
            docs.add(
                    Doc.builder()
                            .id(Integer.toString(i+3))
                            .vector(Vector.builder().value(Collections.nCopies(4, (float) i+3)).build())
                            .fields(
                                    new HashMap<String, Object>() {
                                        {
                                            put("document_id", "paper" + finalI % 3);
                                            put("chunk_id", finalI);
                                        }
                                    }
                            )
                            .build());
        }

        InsertDocRequest insertRequest = InsertDocRequest.builder().docs(docs).build();
        Response<Void> insertResponse = collection.insert(insertRequest);
        assert insertResponse.isSuccess();



        // 构建Vector
        Vector queryVector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();

        // 构建 QueryDocGroupByRequest
        QueryDocGroupByRequest queryDocGroupByRequest =
                QueryDocGroupByRequest.builder().includeVector(true).vector(queryVector)
                        .groupByField("document_id")
                        .groupCount(2)
                        .groupTopk(3)
                        .build();

        // 进行分组Doc检索
        Response<List<Group>> response = collection.queryGroupBy(queryDocGroupByRequest);

        // 判断是否成功
        assert response.isSuccess();

        System.out.println(response);
        // example output:
        // {
        //     "code": 0,
        //     "message": "Success",
        //     "requestId": "47404048-6f40-47ad-9d62-2675704afb26",
        //     "output": [
        //         {
        //             "groupId": "paper2",
        //             "docs": [
        //                 {
        //                     "id": "8",
        //                     "vector": {
        //                         "value": [
        //                             8.0,
        //                             8.0,
        //                             8.0,
        //                             8.0
        //                         ]
        //                     },
        //                     "fields": {
        //                         "document_id": "paper2",
        //                         "chunk_id": 5
        //                     },
        //                     "score": 8.0,
        //                     "sparseVector": {
        //
        //                     }
        //                 },
        //                 {
        //                     "id": "5",
        //                     "vector": {
        //                         "value": [
        //                             5.0,
        //                             5.0,
        //                             5.0,
        //                             5.0
        //                         ]
        //                     },
        //                     "fields": {
        //                         "document_id": "paper2",
        //                         "chunk_id": 2
        //                     },
        //                     "score": 5.0,
        //                     "sparseVector": {
        //
        //                     }
        //                 }
        //             ]
        //         },
        //         {
        //             "groupId": "paper1",
        //             "docs": [
        //                 {
        //                     "id": "7",
        //                     "vector": {
        //                         "value": [
        //                             7.0,
        //                             7.0,
        //                             7.0,
        //                             7.0
        //                         ]
        //                     },
        //                     "fields": {
        //                         "document_id": "paper1",
        //                         "chunk_id": 4
        //                     },
        //                     "score": 7.0,
        //                     "sparseVector": {
        //
        //                     }
        //                 },
        //                 {
        //                     "id": "4",
        //                     "vector": {
        //                         "value": [
        //                             4.0,
        //                             4.0,
        //                             4.0,
        //                             4.0
        //                         ]
        //                     },
        //                     "fields": {
        //                         "document_id": "paper1",
        //                         "chunk_id": 1
        //                     },
        //                     "score": 4.0,
        //                     "sparseVector": {
        //
        //                     }
        //                 }
        //             ]
        //         }
        //     ]
        // }
    }
}

根据主键(对应的向量)进行分组相似性检索

Java示例:

scss 复制代码
        // 构建QueryDocGroupByRequest
        QueryDocGroupByRequest request = QueryDocGroupByRequest.builder()
                .groupByField("age")          
                .id("1")
                .groupCount(10)  // 返回10个分组
                .groupTopk(10)   // 每个分组最多返回10个doc
                .outputFields(Arrays.asList("name", "age")) // 仅返回name、age这2个Field
                .includeVector(true)
                .build();

        // 根据主键(对应的向量)进行分组相似性检索
        Response<List<Group>> response2 = collection.queryGroupBy(request);

        // 判断检索是否成功
        assert response2.isSuccess();

带过滤条件的分组相似性检索

Java示例:

scss 复制代码
        Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();

        // 构建QueryDocGroupByRequest
        QueryDocGroupByRequest request = QueryDocGroupByRequest.builder()
                .groupByField("age")          
                .vector(vector)
                .filter("age > 18") // 条件过滤,仅对age > 18的Doc进行相似性检索
                .outputFields(Arrays.asList("name", "age")) // 仅返回name、age这2个Field
                .includeVector(true)
                .build();

        // 根据向量或者主键进行分组相似性检索 + 条件过滤
        Response<List<Group>> response = collection.queryGroupBy(request);

        // 判断检索是否成功
        assert response.isSuccess();

带有Sparse Vector的分组向量检索

**说明

Sparse Vector(稀疏向量)可用于关键词权重表示,实现带关键词感知能力的向量检索

Java示例:

scss 复制代码
        Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();

        // 构建QueryDocGroupByRequest
        QueryDocGroupByRequest request = QueryDocGroupByRequest.builder()
                .groupByField("age")          
                .vector(vector)
                .sparseVector(
                        new Map<Integer, Float>() {
                            {
                                put(1, 0.4f);
                                put(10000, 0.6f);
                                put(222222, 0.8f);
                            }
                        }) // 稀疏向量
                .build();

        //根据向量进行分组相似性检索 + 稀疏向量
        Response<List<Group>> response = collection.queryGroupBy(request);

        // 判断检索是否成功
        assert response.isSuccess();
相关推荐
小猿姐2 小时前
实测对比:哪款开源 Kubernetes MySQL Operator 最值得用?(2026 深度评测)
数据库·mysql·云原生
一灯架构4 小时前
90%的人答错!一文带你彻底搞懂ArrayList
java·后端
倔强的石头_4 小时前
从 “存得下” 到 “算得快”:工业物联网需要新一代时序数据平台
数据库
Y4090015 小时前
【多线程】线程安全(1)
java·开发语言·jvm
TDengine (老段)5 小时前
TDengine IDMP 可视化 —— 分享
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·时序数据
布局呆星5 小时前
SpringBoot 基础入门
java·spring boot·spring
风吹迎面入袖凉6 小时前
【Redis】Redisson的可重入锁原理
java·redis
GottdesKrieges6 小时前
OceanBase数据库备份配置
数据库·oceanbase
w6100104666 小时前
cka-2026-ConfigMap
java·linux·cka·configmap