Skip to content

Commit 3760f45

Browse files
committed
feat(query): add diversity selection parameter to supported query types
- NearMedia - NearText - NearVector - NearObject
1 parent 3866ce2 commit 3760f45

12 files changed

Lines changed: 160 additions & 3 deletions

File tree

src/it/java/io/weaviate/integration/SearchITest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.weaviate.client6.v1.api.collections.generate.GenerativeObject;
3333
import io.weaviate.client6.v1.api.collections.generate.TaskOutput;
3434
import io.weaviate.client6.v1.api.collections.generative.DummyGenerative;
35+
import io.weaviate.client6.v1.api.collections.query.Diversity;
3536
import io.weaviate.client6.v1.api.collections.query.FetchObjectById;
3637
import io.weaviate.client6.v1.api.collections.query.Filter;
3738
import io.weaviate.client6.v1.api.collections.query.GroupBy;
@@ -884,4 +885,17 @@ public void testQueryProfile_groupBy() throws Exception {
884885
InstanceOfAssertFactories.map(String.class, String.class))
885886
.isNotEmpty());
886887
}
888+
889+
@Test
890+
public void testDiversity() throws Exception {
891+
Version.V137.orSkip();
892+
893+
var things = client.collections.use(COLLECTION);
894+
var resp = things.query.nearVector(searchVector,
895+
opt -> opt.diversity(Diversity.mmr(div -> div.limit(3))));
896+
897+
Assertions.assertThat(resp)
898+
.extracting(QueryResponse::objects, InstanceOfAssertFactories.LIST)
899+
.hasSize(3);
900+
}
887901
}

src/main/java/io/weaviate/client6/v1/api/collections/query/BaseVectorSearchBuilder.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ abstract class BaseVectorSearchBuilder<SelfT extends BaseVectorSearchBuilder<Sel
77
Float distance;
88
Float certainty;
99
Rerank rerank;
10+
Diversity diversity;
1011

1112
/**
1213
* Discard objects whose vectors are further away
@@ -45,4 +46,13 @@ public SelfT rerank(Rerank rerank) {
4546
this.rerank = rerank;
4647
return (SelfT) this;
4748
}
49+
50+
/**
51+
* Apply diversity selection to the query results.
52+
*/
53+
@SuppressWarnings("unchecked")
54+
public SelfT diversity(Diversity diversity) {
55+
this.diversity = diversity;
56+
return (SelfT) this;
57+
}
4858
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package io.weaviate.client6.v1.api.collections.query;
2+
3+
import java.util.function.Function;
4+
5+
import io.weaviate.client6.v1.internal.ObjectBuilder;
6+
import io.weaviate.client6.v1.internal.TaggedUnion;
7+
import io.weaviate.client6.v1.internal.grpc.protocol.WeaviateProtoBaseSearch;
8+
9+
public interface Diversity extends TaggedUnion<Diversity.Kind, Object> {
10+
public enum Kind {
11+
MMR;
12+
}
13+
14+
/** Use {@link Mmr} diversity selection. */
15+
public static Mmr mmr(Function<Mmr.Builder, ObjectBuilder<Mmr>> fn) {
16+
return Mmr.of(fn);
17+
}
18+
19+
/** Return this diversity as concrete {@link Mmr} type. */
20+
public default Mmr asMmr() {
21+
return _as(Diversity.Kind.MMR);
22+
}
23+
24+
/** Maximal Marginal Relevance diversity selection. */
25+
public record Mmr(Integer limit, Float balance) implements Diversity {
26+
27+
@Override
28+
public Diversity.Kind _kind() {
29+
return Diversity.Kind.MMR;
30+
}
31+
32+
@Override
33+
public Object _self() {
34+
return this;
35+
}
36+
37+
public static Mmr of(Function<Builder, ObjectBuilder<Mmr>> fn) {
38+
return fn.apply(new Builder()).build();
39+
}
40+
41+
public Mmr(Builder builder) {
42+
this(builder.limit, builder.balance);
43+
}
44+
45+
public static class Builder implements ObjectBuilder<Mmr> {
46+
private Integer limit;
47+
private Float balance;
48+
49+
public Builder limit(int limit) {
50+
this.limit = limit;
51+
return this;
52+
}
53+
54+
public Builder balance(float balance) {
55+
this.balance = balance;
56+
return this;
57+
}
58+
59+
@Override
60+
public Mmr build() {
61+
return new Mmr(this);
62+
}
63+
}
64+
}
65+
66+
public default WeaviateProtoBaseSearch.Selection.Builder toProto() {
67+
var selection = WeaviateProtoBaseSearch.Selection.newBuilder();
68+
switch (_kind()) {
69+
case MMR:
70+
var mmrBuilder = WeaviateProtoBaseSearch.Selection.MMR.newBuilder();
71+
var mmr = asMmr();
72+
if (mmr.limit() != null) {
73+
mmrBuilder.setLimit(mmr.limit());
74+
}
75+
if (mmr.balance() != null) {
76+
mmrBuilder.setBalance(mmr.balance());
77+
}
78+
selection.setMmr(mmrBuilder);
79+
break;
80+
}
81+
return selection;
82+
}
83+
}

src/main/java/io/weaviate/client6/v1/api/collections/query/NearAudio.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@
1010
import io.weaviate.client6.v1.internal.grpc.protocol.WeaviateProtoBaseSearch;
1111
import io.weaviate.client6.v1.internal.grpc.protocol.WeaviateProtoSearchGet;
1212

13-
public record NearAudio(Target searchTarget, Float distance, Float certainty, Rerank rerank, BaseQueryOptions common)
13+
public record NearAudio(
14+
Target searchTarget,
15+
Float distance,
16+
Float certainty,
17+
Rerank rerank,
18+
Diversity diversity,
19+
BaseQueryOptions common)
1420
implements QueryOperator, AggregateObjectFilter {
1521

1622
public static NearAudio of(String audio) {
@@ -35,6 +41,7 @@ public NearAudio(Builder builder) {
3541
builder.distance,
3642
builder.certainty,
3743
builder.rerank,
44+
builder.diversity,
3845
builder.baseOptions());
3946
}
4047

@@ -81,7 +88,9 @@ private WeaviateProtoBaseSearch.NearAudioSearch.Builder protoBuilder() {
8188
} else if (distance != null) {
8289
nearAudio.setDistance(distance);
8390
}
84-
91+
if (diversity != null) {
92+
nearAudio.setSelection(diversity.toProto());
93+
}
8594
return nearAudio;
8695
}
8796
}

src/main/java/io/weaviate/client6/v1/api/collections/query/NearDepth.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public record NearDepth(
1515
Float distance,
1616
Float certainty,
1717
Rerank rerank,
18+
Diversity diversity,
1819
BaseQueryOptions common)
1920
implements QueryOperator, AggregateObjectFilter {
2021

@@ -40,6 +41,7 @@ public NearDepth(Builder builder) {
4041
builder.distance,
4142
builder.certainty,
4243
builder.rerank,
44+
builder.diversity,
4345
builder.baseOptions());
4446
}
4547

@@ -86,6 +88,9 @@ private WeaviateProtoBaseSearch.NearDepthSearch.Builder protoBuilder() {
8688
} else if (distance != null) {
8789
nearDepth.setDistance(distance);
8890
}
91+
if (diversity != null) {
92+
nearDepth.setSelection(diversity.toProto());
93+
}
8994
return nearDepth;
9095
}
9196
}

src/main/java/io/weaviate/client6/v1/api/collections/query/NearImage.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public record NearImage(
1515
Float distance,
1616
Float certainty,
1717
Rerank rerank,
18+
Diversity diversity,
1819
BaseQueryOptions common)
1920
implements QueryOperator, AggregateObjectFilter {
2021

@@ -40,6 +41,7 @@ public NearImage(Builder builder) {
4041
builder.distance,
4142
builder.certainty,
4243
builder.rerank,
44+
builder.diversity,
4345
builder.baseOptions());
4446
}
4547

@@ -86,6 +88,9 @@ private WeaviateProtoBaseSearch.NearImageSearch.Builder protoBuilder() {
8688
} else if (distance != null) {
8789
nearImage.setDistance(distance);
8890
}
91+
if (diversity != null) {
92+
nearImage.setSelection(diversity.toProto());
93+
}
8994
return nearImage;
9095
}
9196
}

src/main/java/io/weaviate/client6/v1/api/collections/query/NearImu.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public record NearImu(
1515
Float distance,
1616
Float certainty,
1717
Rerank rerank,
18+
Diversity diversity,
1819
BaseQueryOptions common)
1920
implements QueryOperator, AggregateObjectFilter {
2021

@@ -40,6 +41,7 @@ public NearImu(Builder builder) {
4041
builder.distance,
4142
builder.certainty,
4243
builder.rerank,
44+
builder.diversity,
4345
builder.baseOptions());
4446
}
4547

@@ -86,6 +88,10 @@ private WeaviateProtoBaseSearch.NearIMUSearch.Builder protoBuilder() {
8688
} else if (distance != null) {
8789
nearImu.setDistance(distance);
8890
}
91+
if (diversity != null) {
92+
nearImu.setSelection(diversity.toProto());
93+
}
94+
8995
return nearImu;
9096
}
9197
}

src/main/java/io/weaviate/client6/v1/api/collections/query/NearObject.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public record NearObject(
1313
Float distance,
1414
Float certainty,
1515
Rerank rerank,
16+
Diversity diversity,
1617
BaseQueryOptions common)
1718
implements QueryOperator, AggregateObjectFilter {
1819

@@ -30,6 +31,7 @@ public NearObject(Builder builder) {
3031
builder.distance,
3132
builder.certainty,
3233
builder.rerank,
34+
builder.diversity,
3335
builder.baseOptions());
3436
}
3537

@@ -74,6 +76,9 @@ private WeaviateProtoBaseSearch.NearObject.Builder protoBuilder() {
7476
} else if (distance != null) {
7577
nearObject.setDistance(distance);
7678
}
79+
if (diversity != null) {
80+
nearObject.setSelection(diversity.toProto());
81+
}
7782
return nearObject;
7883
}
7984
}

src/main/java/io/weaviate/client6/v1/api/collections/query/NearText.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public record NearText(
2020
Rerank rerank,
2121
Move moveTo,
2222
Move moveAway,
23+
Diversity diversity,
2324
BaseQueryOptions common) implements QueryOperator, AggregateObjectFilter {
2425

2526
public static NearText of(String... concepts) {
@@ -46,6 +47,7 @@ public NearText(Builder builder) {
4647
builder.rerank,
4748
builder.moveTo,
4849
builder.moveAway,
50+
builder.diversity,
4951
builder.baseOptions());
5052
}
5153

@@ -166,7 +168,9 @@ WeaviateProtoBaseSearch.NearTextSearch.Builder protoBuilder(boolean withTargets)
166168
moveAway.appendTo(away);
167169
nearText.setMoveAway(away);
168170
}
169-
171+
if (diversity != null) {
172+
nearText.setSelection(diversity.toProto());
173+
}
170174
return nearText;
171175
}
172176
}

src/main/java/io/weaviate/client6/v1/api/collections/query/NearThermal.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public record NearThermal(Target searchTarget,
1414
Float distance,
1515
Float certainty,
1616
Rerank rerank,
17+
Diversity diversity,
1718
BaseQueryOptions common)
1819
implements QueryOperator, AggregateObjectFilter {
1920

@@ -39,6 +40,7 @@ public NearThermal(Builder builder) {
3940
builder.distance,
4041
builder.certainty,
4142
builder.rerank,
43+
builder.diversity,
4244
builder.baseOptions());
4345
}
4446

@@ -85,6 +87,9 @@ private WeaviateProtoBaseSearch.NearThermalSearch.Builder protoBuilder() {
8587
} else if (distance != null) {
8688
nearThermal.setDistance(distance);
8789
}
90+
if (diversity != null) {
91+
nearThermal.setSelection(diversity.toProto());
92+
}
8893
return nearThermal;
8994
}
9095
}

0 commit comments

Comments
 (0)