diff --git a/sdk-core/src/main/java/io/milvus/param/ParamUtils.java b/sdk-core/src/main/java/io/milvus/param/ParamUtils.java index 0bdba579c..945732ab7 100644 --- a/sdk-core/src/main/java/io/milvus/param/ParamUtils.java +++ b/sdk-core/src/main/java/io/milvus/param/ParamUtils.java @@ -727,6 +727,10 @@ public UpsertRequest buildUpsertRequest() { @SuppressWarnings("unchecked") public static ByteString convertPlaceholder(List vectors, PlaceholderType placeType) throws ParamException { + return convertPlaceholder(vectors, placeType, false); + } + + public static ByteString convertPlaceholder(List vectors, PlaceholderType placeType, boolean elementLevel) throws ParamException { PlaceholderType plType = PlaceholderType.None; List byteStrings = new ArrayList<>(); for (Object vector : vectors) { @@ -771,7 +775,8 @@ public static ByteString convertPlaceholder(List vectors, PlaceholderType pla PlaceholderValue.Builder pldBuilder = PlaceholderValue.newBuilder() .setTag(Constant.VECTOR_TAG) - .setType(plType); + .setType(plType) + .setElementLevel(elementLevel); byteStrings.forEach(pldBuilder::addValues); PlaceholderValue plv = pldBuilder.build(); diff --git a/sdk-core/src/main/java/io/milvus/v2/service/vector/response/SearchResp.java b/sdk-core/src/main/java/io/milvus/v2/service/vector/response/SearchResp.java index d6fb1762a..273d77e8a 100644 --- a/sdk-core/src/main/java/io/milvus/v2/service/vector/response/SearchResp.java +++ b/sdk-core/src/main/java/io/milvus/v2/service/vector/response/SearchResp.java @@ -103,6 +103,7 @@ public static class SearchResult { private Object id; private String primaryKey; private Map highlightResults; + private Long elementOffset; private SearchResult(SearchResultBuilder builder) { this.entity = builder.entity; @@ -110,6 +111,7 @@ private SearchResult(SearchResultBuilder builder) { this.id = builder.id; this.primaryKey = builder.primaryKey; this.highlightResults = builder.highlightResults == null ? new HashMap<>() : builder.highlightResults; + this.elementOffset = builder.elementOffset; } public static SearchResultBuilder builder() { @@ -161,10 +163,19 @@ public void addHighlightResult(String fieldName, HighlightResult highlightResult this.highlightResults.put(fieldName, highlightResult); } + public Long getElementOffset() { + return elementOffset; + } + + public void setElementOffset(Long elementOffset) { + this.elementOffset = elementOffset; + } + @Override public String toString() { return "{" + getPrimaryKey() + ": " + getId() + ", Score: " + getScore() + ", OutputFields: " + entity + - (MapUtils.isEmpty(highlightResults) ? "" : (", HighlightResults: " + highlightResults)) + "}"; + (MapUtils.isEmpty(highlightResults) ? "" : (", HighlightResults: " + highlightResults)) + + (elementOffset == null ? "" : (", ElementOffset: " + elementOffset)) + "}"; } public static class SearchResultBuilder { @@ -173,6 +184,7 @@ public static class SearchResultBuilder { private Object id; private String primaryKey = "id"; private Map highlightResults = new HashMap<>(); + private Long elementOffset; public SearchResultBuilder entity(Map entity) { this.entity = entity; @@ -205,6 +217,11 @@ public SearchResultBuilder addHighlightResult(String fieldName, HighlightResult return this; } + public SearchResultBuilder elementOffset(Long elementOffset) { + this.elementOffset = elementOffset; + return this; + } + public SearchResult build() { return new SearchResult(this); } diff --git a/sdk-core/src/main/java/io/milvus/v2/utils/ConvertUtils.java b/sdk-core/src/main/java/io/milvus/v2/utils/ConvertUtils.java index b98ef5bb6..69f58b03c 100644 --- a/sdk-core/src/main/java/io/milvus/v2/utils/ConvertUtils.java +++ b/sdk-core/src/main/java/io/milvus/v2/utils/ConvertUtils.java @@ -106,7 +106,7 @@ public List> getEntities(SearchResults response) { .build()); } - // set highlight + // set highlight and element offset SearchResultsWrapper.Position position = searchResultsWrapper.getOffsetByIndex(i); long offset = position.getOffset(); long k = position.getK(); @@ -127,6 +127,14 @@ public List> getEntities(SearchResults response) { } } + // set element offset + if (response.getResults().hasElementIndices()) { + LongArray elementIndices = response.getResults().getElementIndices(); + for (long j = 0; j < k; j++) { + singleResults.get((int) j).setElementOffset(elementIndices.getData((int) (offset + j))); + } + } + searchResults.add(singleResults); } return searchResults; diff --git a/sdk-core/src/main/java/io/milvus/v2/utils/VectorUtils.java b/sdk-core/src/main/java/io/milvus/v2/utils/VectorUtils.java index af2b41910..f02b03fb9 100644 --- a/sdk-core/src/main/java/io/milvus/v2/utils/VectorUtils.java +++ b/sdk-core/src/main/java/io/milvus/v2/utils/VectorUtils.java @@ -148,7 +148,7 @@ private static long getGuaranteeTimestamp(ConsistencyLevel consistencyLevel, Str } } - private static ByteString convertPlaceholder(List data, PlaceholderType placeType) { + private static ByteString convertPlaceholder(List data, PlaceholderType placeType, boolean elementLevel) { if (placeType == PlaceholderType.VarChar) { List byteStrings = new ArrayList<>(); for (Object obj : data) { @@ -156,7 +156,8 @@ private static ByteString convertPlaceholder(List data, PlaceholderType } PlaceholderValue.Builder pldBuilder = PlaceholderValue.newBuilder() .setTag(Constant.VECTOR_TAG) - .setType(placeType); + .setType(placeType) + .setElementLevel(elementLevel); byteStrings.forEach(pldBuilder::addValues); PlaceholderValue plv = pldBuilder.build(); @@ -166,14 +167,14 @@ private static ByteString convertPlaceholder(List data, PlaceholderType return placeholderGroup.toByteString(); } else { try { - return ParamUtils.convertPlaceholder(data, placeType); + return ParamUtils.convertPlaceholder(data, placeType, elementLevel); } catch (ParamException e) { throw new MilvusClientException(ErrorCode.INVALID_PARAMS, e.getMessage()); } } } - private static void convertSearchTarget(SearchReq request, SearchRequest.Builder builder) { + private static void convertSearchTarget(SearchReq request, SearchRequest.Builder builder, boolean elementLevel) { // prepare target, the input could be: // 1. vectors or string list for doc-in-doc-out // 2. ids list for search by primary keys @@ -200,7 +201,7 @@ private static void convertSearchTarget(SearchReq request, SearchRequest.Builder data.add(vector.getData()); } - ByteString byteStr = convertPlaceholder(data, plType); + ByteString byteStr = convertPlaceholder(data, plType, elementLevel); builder.setPlaceholderGroup(byteStr); builder.setNq(vectors.size()); } else { @@ -246,7 +247,9 @@ public SearchRequest ConvertToGrpcSearchRequest(SearchReq request) { } // target vectors or ids - convertSearchTarget(request, builder); + String filter = request.getFilter(); + boolean elementLevel = filter != null && filter.contains("element_filter"); + convertSearchTarget(request, builder, elementLevel); // search parameters // tries to fit the compatibility between v2.5.1 and older versions @@ -515,7 +518,7 @@ public static SearchRequest convertAnnSearchParam(AnnSearchReq annSearchReq, data.add(vector.getData()); } - ByteString byteStr = convertPlaceholder(data, plType); + ByteString byteStr = convertPlaceholder(data, plType, false); builder.setPlaceholderGroup(byteStr); builder.setNq(vectors.size()); diff --git a/sdk-core/src/main/milvus-proto b/sdk-core/src/main/milvus-proto index fd9875a85..b2c299650 160000 --- a/sdk-core/src/main/milvus-proto +++ b/sdk-core/src/main/milvus-proto @@ -1 +1 @@ -Subproject commit fd9875a85e8e5cdb38d1de8856a1e62fdc85f0fa +Subproject commit b2c299650f7e5a2b66777ed4948dcd54d5547dbd