Skip to content

Java:搜索示例

单向量搜索

与创建集合时的 size 一致,传入查询向量(List<Float> 或与 SearchPoints 要求一致)。

java
import io.qdrant.client.grpc.Points.SearchPoints;
import io.qdrant.client.grpc.Points.ScoredPoint;
import java.util.List;
import java.util.stream.Collectors;

List<Float> query = java.util.Collections.nCopies(384, 0.02f);

List<ScoredPoint> hits = client.searchAsync(
    SearchPoints.newBuilder()
        .setCollectionName("demo_java")
        .addAllVector(query)
        .setLimit(10)
        .setWithPayload(
            io.qdrant.client.grpc.Points.WithPayloadSelector.newBuilder()
                .setEnable(true)
                .build())
        .build()
).get();

for (ScoredPoint sp : hits) {
    System.out.println(sp.getId() + " score=" + sp.getScore());
    System.out.println(sp.getPayloadMap());
}

带范围过滤的搜索

java
import static io.qdrant.client.ConditionFactory.range;

import io.qdrant.client.grpc.Points.Filter;
import io.qdrant.client.grpc.Points.Range;

List<ScoredPoint> filtered = client.searchAsync(
    SearchPoints.newBuilder()
        .setCollectionName("demo_java")
        .addAllVector(query)
        .setFilter(Filter.newBuilder()
            .addMust(range("rand_number",
                Range.newBuilder().setGte(1).setLte(100).build()))
            .build())
        .setLimit(5)
        .build()
).get();

matchKeywordmatch 等与 Python 的 FieldCondition 对应;先为字段创建 payload index

异步与线程池

searchAsync 返回 ListenableFuture,可在 GuavaCompletableFuture 中组合;高并发时注意 Qdrant 连接数单实例 QPS

与 Python 行为对齐

同一集合、同一查询向量、同一 limit,Python(REST)与 Java(gRPC)返回的 top 结果顺序与分数 应高度一致(数值可能有微小浮点差异)。

小结

Java 路径:QdrantGrpcClient → createCollection → upsert → search;向量维度和距离与 Python 示例必须相同。