Appearance
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();matchKeyword、match 等与 Python 的 FieldCondition 对应;先为字段创建 payload index。
异步与线程池
searchAsync 返回 ListenableFuture,可在 Guava 或 CompletableFuture 中组合;高并发时注意 Qdrant 连接数 与 单实例 QPS。
与 Python 行为对齐
同一集合、同一查询向量、同一 limit,Python(REST)与 Java(gRPC)返回的 top 结果顺序与分数 应高度一致(数值可能有微小浮点差异)。
小结
Java 路径:QdrantGrpcClient → createCollection → upsert → search;向量维度和距离与 Python 示例必须相同。