前提条件
- 已创建Cluster:创建Cluster。
- 已获得API-KEY:API-KEY管理。
- 已安装最新版SDK:安装DashVector SDK。
接口定义
Java示例:
swift
// class DashVectorCollection
// 同步接口
public Response<List<Doc>> query(QueryDocRequest queryDocRequest);
// 异步接口
public ListenableFuture<Response<List<Doc>>> queryAsync(QueryDocRequest queryDocRequest);
使用示例
**说明
- 需要使用您的api-key替换示例中的YOUR_API_KEY、您的Cluster Endpoint替换示例中的YOUR_CLUSTER_ENDPOINT,代码才能正常运行。
- 本示例需要参考新建Collection-使用示例提前创建好名称为
quickstart
的Collection,并参考插入Doc提前插入部分数据。
根据向量进行相似性检索
Java示例:
java
import com.aliyun.dashvector.DashVectorClient;
import com.aliyun.dashvector.DashVectorCollection;
import com.aliyun.dashvector.common.DashVectorException;
import com.aliyun.dashvector.models.Doc;
import com.aliyun.dashvector.models.Vector;
import com.aliyun.dashvector.models.requests.QueryDocRequest;
import com.aliyun.dashvector.models.responses.Response;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) throws DashVectorException {
DashVectorClient client = new DashVectorClient("YOUR_API_KEY", "YOUR_CLUSTER_ENDPOINT");
DashVectorCollection collection = client.get("quickstart");
// 构建Vector
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// 构建QueryDocRequest
QueryDocRequest request = QueryDocRequest.builder()
.vector(vector)
.topk(100)
.includeVector(true)
.build();
// 进行Doc检索
Response<List<Doc>> response = collection.query(request);
// 判断请求是否成功
// assert response.isSuccess()
System.out.println(response);
// example output:
// {
// "code":0,
// "message":"Success",
// "requestId":"b26ce0b8-0caf-4836-8136-df889d79ae91",
// "output":[
// {
// "id":"1",
// "vector":{
// "value":[
// 0.10000000149011612,
// 0.20000000298023224,
// 0.30000001192092896,
// 0.4000000059604645
// ]
// },
// "fields":{
// "name":"zhangsan",
// "age":20,
// "weight":100.0,
// "anykey1":"String",
// "anykey2":1,
// "anykey3":true,
// "anykey4":3.1415926
// },
// "score":1.1920929E-7
// }
// ]
// }
}
}
根据主键(对应的向量)进行相似性检索
Java示例:
scss
// 构建QueryDocRequest
QueryDocRequest request = QueryDocRequest.builder()
.id("1")
.topk(100)
.outputFields(Arrays.asList("name", "age")) // 仅返回name、age这2个Field
.includeVector(true)
.build();
// 根据主键(对应的向量)进行相似性检索
Response<List<Doc>> response = collection.query(request);
// 判断检索是否成功
assert response.isSuccess()
带过滤条件的相似性检索
Java示例:
scss
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// 构建QueryDocRequest
QueryDocRequest request = QueryDocRequest.builder()
.vector(vector) // 向量检索,也可设置主键检索
.topk(100)
.filter("age > 18") // 条件过滤,仅对age > 18的Doc进行相似性检索
.outputFields(Arrays.asList("name", "age")) // 仅返回name、age这2个Field
.includeVector(true)
.build();
// 根据向量或者主键进行相似性检索 + 条件过滤
Response<List<Doc>> response = collection.query(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();
// 构建带有Sparse Vector的QueryDocRequest
QueryDocRequest request = QueryDocRequest.builder()
.vector(vector) // 向量检索
.sparseVector(
new Map<Integer, Float>() {
{
put(1, 0.4f);
put(10000, 0.6f);
put(222222, 0.8f);
}
}) // 稀疏向量
.build();
// 根据向量进行相似性检索 + 稀疏向量
Response<List<Doc>> response = collection.query(request);
// 判断检索是否成功
assert response.isSuccess()
通过过滤条件进行匹配查询
Java示例:
scss
// 构建只携带过滤条件,不包含主键或向量的QueryDocRequest
QueryDocRequest request = QueryDocRequest.builder()
.topk(100)
.filter("age > 18") // 条件过滤,仅对age > 18的Doc进行相似性检索
.outputFields(Arrays.asList("name", "age")) // 仅返回name、age这2个Field
.includeVector(true)
.build();
// 支持向量和主键都不传入,那么只进行条件过滤
Response<List<Doc>> response = collection.query(request);
// 判断检索是否成功
assert response.isSuccess()
向量检索高级参数
**说明
详情可参考 向量检索高级参数。
Java示例:
scss
public void queryParameter() {
assert collection.isSuccess();
// 构建Vector
Vector queryVector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
VectorQuery vectorQuery = VectorQuery.builder().vector(queryVector).ef(1000).linear(false).radius(100.0F).build();
QueryDocRequest request = QueryDocRequest.builder().vectorQuery(vectorQuery).build();
Response<List<Doc>> response = collection.query(request);
System.out.println(response);
assert response.isSuccess();
}
多向量检索
**说明
详情可参考 多向量检索。
scss
SparseVector abstruct_vector = SparseVector.builder()
.value(0L, 0.4f)
.value(1L, 0.6f)
.value(2L, 0.8f)
.build();
QueryDocRequest request = QueryDocRequest.builder()
.vectors("title", VectorQuery.builder().vector(Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build()).numCandidates(3).build())
.vectors("content", VectorQuery.builder().vector(Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f)).build()).numCandidates(3).build())
.sparseVectors("abstruct", SparseVectorQuery.builder().vector(abstruct_vector).build())
// 加权融合排序
.ranker(WeightedRanker.builder().weights(new HashMap<String, Float>() {{
put("title", 10000.0F);
put("content", 2.0F);
}})
.build())
// 倒数秩融合排序
// .ranker(RrfRanker.builder().rankConstant(100).build())
.topk(1)
.build();
Response<List<Doc>> response = collection.query(request);
使用多向量的一个向量执行检索
scss
public void querySingleVector() {
VectorQuery vectorQuery = VectorQuery.builder().vector(Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build())
.ef(1000)
.radius(100.0F)
.linear(false)
.build();
QueryDocRequest request = QueryDocRequest.builder()
.vector("title", vectorQuery)
.topk(10)
.build();
Response<List<Doc>> response = collection.query(request);
System.out.println(response);
assert response.isSuccess();
}