From 2f2cf7bf7499b523f6596efb3a319fe63a021fe5 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 3 Jul 2023 13:38:00 +1200 Subject: [PATCH 1/8] Add Knn query type Signed-off-by: Thomas Farr --- .../opensearch/_types/query_dsl/KnnQuery.java | 202 ++++++++++++++++++ .../opensearch/_types/query_dsl/Query.java | 30 +++ 2 files changed, 232 insertions(+) create mode 100644 java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/KnnQuery.java diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/KnnQuery.java b/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/KnnQuery.java new file mode 100644 index 0000000000..91beeec75b --- /dev/null +++ b/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/KnnQuery.java @@ -0,0 +1,202 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.client.opensearch._types.query_dsl; + +import jakarta.json.stream.JsonGenerator; +import java.util.function.Function; +import javax.annotation.Nullable; +import org.opensearch.client.json.JsonpDeserializable; +import org.opensearch.client.json.JsonpDeserializer; +import org.opensearch.client.json.JsonpMapper; +import org.opensearch.client.json.ObjectBuilderDeserializer; +import org.opensearch.client.json.ObjectDeserializer; +import org.opensearch.client.util.ApiTypeHelper; +import org.opensearch.client.util.ObjectBuilder; + +@JsonpDeserializable +public class KnnQuery extends QueryBase implements QueryVariant { + private final String field; + private final float[] vector; + private final int k; + @Nullable + private final Query filter; + + private KnnQuery(Builder builder) { + super(builder); + + this.field = ApiTypeHelper.requireNonNull(builder.field, this, "field"); + this.vector = ApiTypeHelper.requireNonNull(builder.vector, this, "vector"); + this.k = ApiTypeHelper.requireNonNull(builder.k, this, "k"); + this.filter = builder.filter; + } + + public static KnnQuery of(Function> fn) { + return fn.apply(new Builder()).build(); + } + + /** + * Query variant kind. + * @return The query variant kind. + */ + @Override + public Query.Kind _queryKind() { + return Query.Kind.Knn; + } + + /** + * Required - The target field. + * @return The target field. + */ + public final String field() { + return this.field; + } + + /** + * Required - The vector to search for. + * @return The vector to search for. + */ + public final float[] vector() { + return this.vector; + } + + /** + * Required - The number of neighbors the search of each graph will return. + * @return The number of neighbors to return. + */ + public final int k() { + return this.k; + } + + /** + * Optional - A query to filter the results of the query. + * @return The filter query. + */ + @Nullable + public final Query filter() { + return this.filter; + } + + @Override + protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) { + generator.writeStartObject(this.field); + + super.serializeInternal(generator, mapper); + + // TODO: Implement the rest of the serialization. + + generator.writeKey("vector"); + generator.writeStartArray(); + for (float value : this.vector) { + generator.write(value); + } + generator.writeEnd(); + + generator.write("k", this.k); + + if (this.filter != null) { + generator.writeKey("filter"); + this.filter.serialize(generator, mapper); + } + + generator.writeEnd(); + } + + /** + * Builder for {@link KnnQuery}. + */ + public static class Builder extends QueryBase.AbstractBuilder implements ObjectBuilder { + @Nullable + private String field; + @Nullable + private float[] vector; + @Nullable + private Integer k; + @Nullable + private Query filter; + + /** + * Required - The target field. + * @param field The target field. + * @return This builder. + */ + public Builder field(@Nullable String field) { + this.field = field; + return this; + } + + /** + * Required - The vector to search for. + * + * @param vector The vector to search for. + * @return This builder. + */ + public Builder vector(@Nullable float[] vector) { + this.vector = vector; + return this; + } + + /** + * Required - The number of neighbors the search of each graph will return. + * + * @param k The number of neighbors to return. + * @return This builder. + */ + public Builder k(@Nullable Integer k) { + this.k = k; + return this; + } + + /** + * Optional - A query to filter the results of the knn query. + * + * @param filter The filter query. + * @return This builder. + */ + public Builder filter(@Nullable Query filter) { + this.filter = filter; + return this; + } + + @Override + protected Builder self() { + return this; + } + + /** + * Builds a {@link KnnQuery}. + * + * @return The built {@link KnnQuery}. + */ + @Override + public KnnQuery build() { + _checkSingleUse(); + + return new KnnQuery(this); + } + } + + public static final JsonpDeserializer _DESERIALIZER = ObjectBuilderDeserializer + .lazy(Builder::new, KnnQuery::setupKnnQueryDeserializer); + + protected static void setupKnnQueryDeserializer(ObjectDeserializer op) { + setupQueryBaseDeserializer(op); + op.add((b, v) -> { + float[] vector = new float[v.size()]; + int i = 0; + for (Float value : v) { + vector[i++] = value; + } + b.vector(vector); + }, JsonpDeserializer.arrayDeserializer(JsonpDeserializer.floatDeserializer()), "vector"); + op.add(Builder::k, JsonpDeserializer.integerDeserializer(), "k"); + op.add(Builder::filter, Query._DESERIALIZER, "filter"); + + op.setKey(Builder::field, JsonpDeserializer.stringDeserializer()); + } +} diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/Query.java b/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/Query.java index 6a22bafbfc..d62b8ede42 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/Query.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/Query.java @@ -103,6 +103,8 @@ public enum Kind implements JsonEnum { Intervals("intervals"), + Knn("knn"), + Match("match"), MatchAll("match_all"), @@ -535,6 +537,23 @@ public IntervalsQuery intervals() { return TaggedUnionUtils.get(this, Kind.Intervals); } + /** + * Is this variant instance of kind {@code knn}? + */ + public boolean isKnn() { + return _kind == Kind.Knn; + } + + /** + * Get the {@code knn} variant value. + * + * @throws IllegalStateException + * if the current variant is not of the {@code knn} kind. + */ + public KnnQuery knn() { + return TaggedUnionUtils.get(this, Kind.Knn); + } + /** * Is this variant instance of kind {@code match}? */ @@ -1340,6 +1359,16 @@ public ObjectBuilder intervals(Function knn(KnnQuery v) { + this._kind = Kind.Knn; + this._value = v; + return this; + } + + public ObjectBuilder knn(Function> fn) { + return this.knn(fn.apply(new KnnQuery.Builder()).build()); + } + public ObjectBuilder match(MatchQuery v) { this._kind = Kind.Match; this._value = v; @@ -1728,6 +1757,7 @@ protected static void setupQueryDeserializer(ObjectDeserializer op) { op.add(Builder::hasParent, HasParentQuery._DESERIALIZER, "has_parent"); op.add(Builder::ids, IdsQuery._DESERIALIZER, "ids"); op.add(Builder::intervals, IntervalsQuery._DESERIALIZER, "intervals"); + op.add(Builder::knn, KnnQuery._DESERIALIZER, "knn"); op.add(Builder::match, MatchQuery._DESERIALIZER, "match"); op.add(Builder::matchAll, MatchAllQuery._DESERIALIZER, "match_all"); op.add(Builder::matchBoolPrefix, MatchBoolPrefixQuery._DESERIALIZER, "match_bool_prefix"); From 015fcd271c494923500d61e0c809806403c2f539 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 3 Jul 2023 16:22:18 +1200 Subject: [PATCH 2/8] Integration test Signed-off-by: Thomas Farr --- .../_types/mapping/KnnVectorMethod.java | 8 ++ .../_types/mapping/KnnVectorProperty.java | 7 ++ .../opensearch/integTest/AbstractKnnIT.java | 80 +++++++++++++++++++ .../integTest/httpclient5/KnnIT.java | 6 ++ .../integTest/restclient/KnnIT.java | 16 ++++ 5 files changed, 117 insertions(+) create mode 100644 java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java create mode 100644 java-client/src/test/java/org/opensearch/client/opensearch/integTest/httpclient5/KnnIT.java create mode 100644 java-client/src/test/java/org/opensearch/client/opensearch/integTest/restclient/KnnIT.java diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorMethod.java b/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorMethod.java index af27ae1c80..e53d9a5601 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorMethod.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorMethod.java @@ -78,6 +78,14 @@ public final Builder parameters(@Nullable Map map) { return this; } + /** + * API name: {@code parameters} + */ + public final Builder parameters(String key, JsonData value) { + this.parameters = _mapPut(this.parameters, key, value); + return this; + } + /** * Builds a {@link KnnVectorMethod}. * diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorProperty.java b/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorProperty.java index 16a9ca6d3b..0f931e7ffe 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorProperty.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorProperty.java @@ -65,6 +65,13 @@ public final Builder method(@Nullable KnnVectorMethod value) { return this; } + /** + * API name: {@code method} + */ + public final Builder method(Function> fn) { + return this.method(fn.apply(new KnnVectorMethod.Builder()).build()); + } + /** * Builds a {@link KnnVectorProperty}. * diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java new file mode 100644 index 0000000000..5cd8b65699 --- /dev/null +++ b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java @@ -0,0 +1,80 @@ +package org.opensearch.client.opensearch.integTest; + +import java.util.Arrays; +import java.util.stream.Collectors; +import org.junit.Test; +import org.opensearch.client.json.JsonData; +import org.opensearch.client.opensearch._types.Refresh; +import org.opensearch.client.opensearch.core.bulk.BulkOperation; + +public abstract class AbstractKnnIT extends OpenSearchJavaClientTestCase { + @Test + public void testCanIndexAndSearchKnn() throws Exception { + final String indexName = "knn-index-and-search"; + + var createIndexResponse = javaClient() + .indices() + .create(c -> c + .index(indexName) + .settings(s -> s + .knn(true) + .knnAlgoParamEfSearch(100)) + .mappings(m -> m + .properties("vector", p -> p + .knnVector(k -> k + .dimension(4) + .method(km -> km + .name("hnsw") + .spaceType("l2") + .engine("nmslib") + .parameters("ef_construction", JsonData.of(256)) + .parameters("m", JsonData.of(16))))))); + + assertEquals(true, createIndexResponse.acknowledged()); + + var docs = new Doc[] { + new Doc(new float[] { 1.5f, 5.5f, 4.5f, 6.4f }, 10.3f), + new Doc(new float[] { 2.5f, 3.5f, 5.6f, 6.7f }, 5.5f), + new Doc(new float[] { 4.5f, 5.5f, 6.7f, 3.7f }, 4.4f), + new Doc(new float[] { 1.5f, 5.5f, 4.5f, 6.4f }, 8.9f) + }; + var bulkOps = Arrays.stream(docs) + .map(d -> BulkOperation.of(o -> o.index(i -> i.document(d)))) + .collect(Collectors.toList()); + + var bulkResponse = javaClient() + .bulk(b -> b + .index(indexName) + .refresh(Refresh.WaitFor) + .operations(bulkOps)); + + assertFalse(bulkResponse.errors()); + + var searchResponse = javaClient() + .search(s -> s + .index(indexName) + .size(2) + .query(q -> q + .knn(k -> k + .field("vector") + .vector(new float[] { 2.0f, 3.0f, 5.0f, 6.0f }) + .k(2))), + Doc.class); + + var hits = searchResponse.hits().hits(); + + assertEquals(2, hits.size()); + assertEquals(5.5f, hits.get(0).source().price, 0.01f); + assertEquals(4.4f, hits.get(1).source().price, 0.01f); + } + + private static class Doc { + public float[] vector; + public float price; + + public Doc(float[] vector, float price) { + this.vector = vector; + this.price = price; + } + } +} diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/httpclient5/KnnIT.java b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/httpclient5/KnnIT.java new file mode 100644 index 0000000000..cb91946f7e --- /dev/null +++ b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/httpclient5/KnnIT.java @@ -0,0 +1,6 @@ +package org.opensearch.client.opensearch.integTest.httpclient5; + +import org.opensearch.client.opensearch.integTest.AbstractKnnIT; + +public class KnnIT extends AbstractKnnIT implements HttpClient5TransportSupport { +} diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/restclient/KnnIT.java b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/restclient/KnnIT.java new file mode 100644 index 0000000000..42a10663b1 --- /dev/null +++ b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/restclient/KnnIT.java @@ -0,0 +1,16 @@ +package org.opensearch.client.opensearch.integTest.restclient; + +import java.io.IOException; +import org.apache.hc.core5.http.HttpHost; +import org.opensearch.client.json.jackson.JacksonJsonpMapper; +import org.opensearch.client.opensearch.integTest.AbstractKnnIT; +import org.opensearch.client.transport.OpenSearchTransport; +import org.opensearch.client.transport.rest_client.RestClientTransport; +import org.opensearch.common.settings.Settings; + +public class KnnIT extends AbstractKnnIT { + @Override + public OpenSearchTransport buildTransport(Settings settings, HttpHost[] hosts) throws IOException { + return new RestClientTransport(buildClient(settings, hosts), new JacksonJsonpMapper()); + } +} From 89856784b2e30b282be41b738e1fcca7bef245d4 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 3 Jul 2023 16:28:21 +1200 Subject: [PATCH 3/8] Checkstyle fix Signed-off-by: Thomas Farr --- .../client/opensearch/integTest/AbstractKnnIT.java | 10 +++++++++- .../client/opensearch/integTest/httpclient5/KnnIT.java | 8 ++++++++ .../client/opensearch/integTest/restclient/KnnIT.java | 8 ++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java index 5cd8b65699..29872f437a 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java @@ -1,3 +1,11 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + package org.opensearch.client.opensearch.integTest; import java.util.Arrays; @@ -72,7 +80,7 @@ private static class Doc { public float[] vector; public float price; - public Doc(float[] vector, float price) { + Doc(float[] vector, float price) { this.vector = vector; this.price = price; } diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/httpclient5/KnnIT.java b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/httpclient5/KnnIT.java index cb91946f7e..a709f7c2a4 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/httpclient5/KnnIT.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/httpclient5/KnnIT.java @@ -1,3 +1,11 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + package org.opensearch.client.opensearch.integTest.httpclient5; import org.opensearch.client.opensearch.integTest.AbstractKnnIT; diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/restclient/KnnIT.java b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/restclient/KnnIT.java index 42a10663b1..0d0ce7c415 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/restclient/KnnIT.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/restclient/KnnIT.java @@ -1,3 +1,11 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + package org.opensearch.client.opensearch.integTest.restclient; import java.io.IOException; From ad886ac1cf425322b6f4f254a6ee2e1789eb0f95 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 3 Jul 2023 16:32:59 +1200 Subject: [PATCH 4/8] Run unreleased test Signed-off-by: Thomas Farr --- .github/workflows/test-integration-unreleased.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-integration-unreleased.yml b/.github/workflows/test-integration-unreleased.yml index d1509fc039..91e4837fd7 100644 --- a/.github/workflows/test-integration-unreleased.yml +++ b/.github/workflows/test-integration-unreleased.yml @@ -3,7 +3,8 @@ name: Integration with Unreleased OpenSearch on: push: branches: - - "main" + - "*" +# - "main" pull_request: branches: - "main" From ff1b78aed276250e00859843954ee4656b252d10 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 3 Jul 2023 16:58:00 +1200 Subject: [PATCH 5/8] Fixes Signed-off-by: Thomas Farr --- .../client/opensearch/_types/mapping/KnnVectorMethod.java | 2 ++ .../opensearch/client/opensearch/indices/IndexSettings.java | 2 +- .../client/opensearch/integTest/AbstractKnnIT.java | 6 +++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorMethod.java b/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorMethod.java index e53d9a5601..5bf4786523 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorMethod.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/_types/mapping/KnnVectorMethod.java @@ -202,10 +202,12 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) { if (this.parameters != null) { generator.writeKey("parameters"); + generator.writeStartObject(); for (Map.Entry item0 : this.parameters.entrySet()) { generator.writeKey(item0.getKey()); item0.getValue().serialize(generator, mapper); } + generator.writeEnd(); } } diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/indices/IndexSettings.java b/java-client/src/main/java/org/opensearch/client/opensearch/indices/IndexSettings.java index e0ec17254a..14f6697f55 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/indices/IndexSettings.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/indices/IndexSettings.java @@ -1066,7 +1066,7 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) { } if (this.knnAlgoParamEfSearch != null) { - generator.writeKey("knn.algo_param_ef_search"); + generator.writeKey("knn.algo_param.ef_search"); generator.write(this.knnAlgoParamEfSearch); } diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java index 29872f437a..b34b67d8ea 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java @@ -73,13 +73,17 @@ public void testCanIndexAndSearchKnn() throws Exception { assertEquals(2, hits.size()); assertEquals(5.5f, hits.get(0).source().price, 0.01f); - assertEquals(4.4f, hits.get(1).source().price, 0.01f); + assertEquals(10.3f, hits.get(1).source().price, 0.01f); } private static class Doc { public float[] vector; public float price; + Doc() { + + } + Doc(float[] vector, float price) { this.vector = vector; this.price = price; From adbbf941c2350112a10ffa93fcc4aa17b0071843 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 3 Jul 2023 17:37:20 +1200 Subject: [PATCH 6/8] Assume knn plugin installed Signed-off-by: Thomas Farr --- .../opensearch/integTest/AbstractKnnIT.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java index b34b67d8ea..ae3f6bee5d 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractKnnIT.java @@ -8,7 +8,9 @@ package org.opensearch.client.opensearch.integTest; +import java.io.IOException; import java.util.Arrays; +import java.util.Objects; import java.util.stream.Collectors; import org.junit.Test; import org.opensearch.client.json.JsonData; @@ -18,6 +20,8 @@ public abstract class AbstractKnnIT extends OpenSearchJavaClientTestCase { @Test public void testCanIndexAndSearchKnn() throws Exception { + assumeKnnInstalled(); + final String indexName = "knn-index-and-search"; var createIndexResponse = javaClient() @@ -76,6 +80,17 @@ public void testCanIndexAndSearchKnn() throws Exception { assertEquals(10.3f, hits.get(1).source().price, 0.01f); } + private void assumeKnnInstalled() throws IOException { + var plugins = javaClient().cat().plugins(); + + var knnInstalled = plugins + .valueBody() + .stream() + .anyMatch(p -> Objects.equals(p.component(), "opensearch-knn")); + + assumeTrue("KNN plugin is not installed", knnInstalled); + } + private static class Doc { public float[] vector; public float price; From 75a15166a9da10ca6776d47ff9920eeb8d825159 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 3 Jul 2023 17:42:35 +1200 Subject: [PATCH 7/8] Changelog Signed-off-by: Thomas Farr --- .github/workflows/test-integration-unreleased.yml | 3 +-- CHANGELOG.md | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-integration-unreleased.yml b/.github/workflows/test-integration-unreleased.yml index 91e4837fd7..d1509fc039 100644 --- a/.github/workflows/test-integration-unreleased.yml +++ b/.github/workflows/test-integration-unreleased.yml @@ -3,8 +3,7 @@ name: Integration with Unreleased OpenSearch on: push: branches: - - "*" -# - "main" + - "main" pull_request: branches: - "main" diff --git a/CHANGELOG.md b/CHANGELOG.md index 8705d44028..20118e6454 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,8 +28,9 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased 2.x] ### Added -- Add support for knn_vector field type ([#529](https://github.com/opensearch-project/opensearch-java/pull/524)) +- Add support for knn_vector field type ([#524](https://github.com/opensearch-project/opensearch-java/pull/524)) - Add translog option object and missing translog sync interval option in index settings ([#518](https://github.com/opensearch-project/opensearch-java/pull/518)) +- Add support for approximate k-NN queries ([#548](https://github.com/opensearch-project/opensearch-java/pull/548)) ### Dependencies - Bumps `jackson` from 2.14.2 to 2.15.2 ((#537)[https://github.com/opensearch-project/opensearch-java/pull/537]) From e280f834f4ef2477939a6992f1675d325325eae4 Mon Sep 17 00:00:00 2001 From: Thomas Farr Date: Mon, 3 Jul 2023 17:45:38 +1200 Subject: [PATCH 8/8] Add to QueryBuilders Signed-off-by: Thomas Farr --- .../client/opensearch/_types/query_dsl/QueryBuilders.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/QueryBuilders.java b/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/QueryBuilders.java index d24d067cf6..d591b343c4 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/QueryBuilders.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/QueryBuilders.java @@ -182,6 +182,13 @@ public static IntervalsQuery.Builder intervals() { return new IntervalsQuery.Builder(); } + /** + * Creates a builder for the {@link KnnQuery knn} {@code Query} variant. + */ + public static KnnQuery.Builder knn() { + return new KnnQuery.Builder(); + } + /** * Creates a builder for the {@link MatchQuery match} {@code Query} variant. */