tvsgetindex(byte[] index) {
* @param index index name
* @return Success: 1; Fail: 0
*/
+ @Override
public Long tvsdelindex(final String index) {
Object obj = jc.sendCommand(SafeEncoder.encode(index), ModuleCommand.TVSDELINDEX, SafeEncoder.encode(index));
return BuilderFactory.LONG.build(obj);
}
+ @Override
public Long tvsdelindex(byte[] index) {
Object obj = jc.sendCommand(index, ModuleCommand.TVSDELINDEX, index);
return BuilderFactory.LONG.build(obj);
}
-
- /**
- * TVS.SCANINDEX TVS.SCANINDEX index_name
- *
- * scan index
- *
- * @param cursor start offset
- * @param params the params: [MATCH pattern] [COUNT count]
- * `MATCH` - Set the pattern which is used to filter the results
- * `COUNT` - Set the number of fields in a single scan (default is 10)
- * `NOVAL` - The return result contains no data portion, only cursor information
- * @return A ScanResult. {@link HashBuilderFactory#EXHSCAN_RESULT_STRING}
- */
- public ScanResult tvsscanindex(Long cursor, HscanParams params) {
- final List args = new ArrayList();
- args.add(toByteArray(cursor));
- args.addAll(params.getParams());
- Object obj = jc.sendCommand(toByteArray(cursor), ModuleCommand.TVSSCANINDEX, args.toArray(new byte[args.size()][]));
- return VectorBuilderFactory.SCAN_CURSOR_STRING.build(obj);
- }
-
/**
* TVS.HSET TVS.HSET index entityid vector [(attribute_key attribute_value) ...]
*
@@ -126,11 +107,13 @@ public ScanResult tvsscanindex(Long cursor, HscanParams params) {
* {@literal k} if success, k is the number of fields that were added..
* throw error like "(error) Illegal vector dimensions" if error
*/
+ @Override
public Long tvshset(final String index, final String entityid, final String vector, final String... params) {
Object obj = jc.sendCommand(SafeEncoder.encode(index), ModuleCommand.TVSHSET, JoinParameters.joinParameters(SafeEncoder.encode(index), SafeEncoder.encode(entityid), SafeEncoder.encode(VectorBuilderFactory.VECTOR_TAG), SafeEncoder.encode(vector), SafeEncoder.encodeMany(params)));
return BuilderFactory.LONG.build(obj);
}
+ @Override
public Long tvshset(byte[] index, byte[] entityid, byte[] vector, final byte[]... params) {
Object obj = jc.sendCommand(index, ModuleCommand.TVSHSET, JoinParameters.joinParameters(index, entityid, SafeEncoder.encode(VectorBuilderFactory.VECTOR_TAG), vector, params));
return BuilderFactory.LONG.build(obj);
@@ -145,11 +128,13 @@ public Long tvshset(byte[] index, byte[] entityid, byte[] vector, final byte[]..
* @param entityid entity id
* @return Map, an empty list when {@code entityid} does not exist.
*/
+ @Override
public Map tvshgetall(final String index, final String entityid) {
Object obj = jc.sendCommand(SafeEncoder.encode(index), ModuleCommand.TVSHGETALL, SafeEncoder.encode(index), SafeEncoder.encode(entityid));
return BuilderFactory.STRING_MAP.build(obj);
}
+ @Override
public Map tvshgetall(byte[] index, byte[] entityid) {
Object obj = jc.sendCommand(index, ModuleCommand.TVSHGETALL, index, entityid);
return BuilderFactory.BYTE_ARRAY_MAP.build(obj);
@@ -165,11 +150,13 @@ public Map tvshgetall(byte[] index, byte[] entityid) {
* @param attrs attrs
* @return List, an empty list when {@code entityid} or {@code attrs} does not exist .
*/
+ @Override
public List tvshmget(final String index, final String entityid, final String... attrs) {
Object obj = jc.sendCommand(SafeEncoder.encode(index), ModuleCommand.TVSHMGET, JoinParameters.joinParameters(SafeEncoder.encode(index), SafeEncoder.encode(entityid), SafeEncoder.encodeMany(attrs)));
return BuilderFactory.STRING_LIST.build(obj);
}
+ @Override
public List tvshmget(byte[] index, byte[] entityid, byte[]... attrs) {
Object obj = jc.sendCommand(index, ModuleCommand.TVSHMGET, JoinParameters.joinParameters(index, entityid, attrs));
return BuilderFactory.BYTE_ARRAY_LIST.build(obj);
@@ -186,11 +173,13 @@ public List tvshmget(byte[] index, byte[] entityid, byte[]... attrs) {
* @return Long integer-reply the number of fields that were removed from the tair-vector
* not including specified but non existing fields.
*/
+ @Override
public Long tvsdel(final String index, final String entityid) {
Object obj = jc.sendCommand(SafeEncoder.encode(index), ModuleCommand.TVSDEL, SafeEncoder.encode(index), SafeEncoder.encode(entityid));
return BuilderFactory.LONG.build(obj);
}
+ @Override
public Long tvsdel(byte[] index, byte[] entityid) {
Object obj = jc.sendCommand(index, ModuleCommand.TVSDEL, index, entityid);
return BuilderFactory.LONG.build(obj);
@@ -207,13 +196,15 @@ public Long tvsdel(byte[] index, byte[] entityid) {
* @return Long integer-reply the number of fields that were removed from the tair-vector
* not including specified but non existing fields.
*/
+ @Override
public Long tvshdel(final String index, final String entityid, final String... attrs) {
Object obj = jc.sendCommand(SafeEncoder.encode(index), ModuleCommand.TVSHDEL, JoinParameters.joinParameters(SafeEncoder.encode(index), SafeEncoder.encode(entityid), SafeEncoder.encodeMany(attrs)));
return BuilderFactory.LONG.build(obj);
}
+ @Override
public Long tvshdel(byte[] index, byte[] entityid, byte[]... attrs) {
- Object obj = jc.sendCommand(index, ModuleCommand.TVSHDEL, JoinParameters.joinParameters(index, entityid, attrs));
+ Object obj = jc.sendCommand(index, ModuleCommand.TVSHDEL, JoinParameters.joinParameters(index, entityid,attrs));
return BuilderFactory.LONG.build(obj);
}
@@ -231,6 +222,7 @@ public Long tvshdel(byte[] index, byte[] entityid, byte[]... attrs) {
* `NOVAL` - The return result contains no data portion, only cursor information
* @return A ScanResult.
*/
+ @Override
public ScanResult tvsscan(final String index, Long cursor, HscanParams params) {
final List args = new ArrayList();
args.add(SafeEncoder.encode(index));
@@ -240,6 +232,7 @@ public ScanResult tvsscan(final String index, Long cursor, HscanParams p
return VectorBuilderFactory.SCAN_CURSOR_STRING.build(obj);
}
+ @Override
public ScanResult tvsscan(byte[] index, Long cursor, HscanParams params) {
final List args = new ArrayList();
args.add(index);
@@ -261,10 +254,12 @@ public ScanResult tvsscan(byte[] index, Long cursor, HscanParams params)
* ef_search range [0, 1000]
* @return VectorBuilderFactory.Knn<>
*/
+ @Override
public VectorBuilderFactory.Knn tvsknnsearch(final String index, Long topn, final String vector, final String... params) {
return tvsknnsearchfilter(index, topn, vector, "", params);
}
+ @Override
public VectorBuilderFactory.Knn tvsknnsearch(byte[] index, Long topn, byte[] vector, final byte[]... params) {
return tvsknnsearchfilter(index, topn, vector, SafeEncoder.encode(""), params);
}
@@ -282,12 +277,14 @@ public VectorBuilderFactory.Knn tvsknnsearch(byte[] index, Long topn, by
* ef_search range [0, 1000]
* @return VectorBuilderFactory.Knn<>
*/
+ @Override
public VectorBuilderFactory.Knn tvsknnsearchfilter(final String index, Long topn, final String vector, final String pattern, final String... params) {
Object obj = jc.sendCommand(SafeEncoder.encode(index), ModuleCommand.TVSKNNSEARCH, JoinParameters.joinParameters(SafeEncoder.encode(index), toByteArray(topn),
SafeEncoder.encode(vector), SafeEncoder.encode(pattern), SafeEncoder.encodeMany(params)));
return VectorBuilderFactory.STRING_KNN_RESULT.build(obj);
}
+ @Override
public VectorBuilderFactory.Knn tvsknnsearchfilter(byte[] index, Long topn, byte[] vector, byte[] pattern, final byte[]... params) {
Object obj = jc.sendCommand(index, ModuleCommand.TVSKNNSEARCH, JoinParameters.joinParameters(index, toByteArray(topn), vector, pattern, params));
return VectorBuilderFactory.BYTE_KNN_RESULT.build(obj);
@@ -303,10 +300,12 @@ public VectorBuilderFactory.Knn tvsknnsearchfilter(byte[] index, Long to
* ef_search range [0, 1000]
* @return Collection<>
*/
+ @Override
public Collection> tvsmknnsearch(final String index, Long topn, Collection vectors, final String... params) {
return tvsmknnsearchfilter(index, topn, vectors, "", params);
}
+ @Override
public Collection> tvsmknnsearch(byte[] index, Long topn, Collection vectors, final byte[]... params) {
return tvsmknnsearchfilter(index, topn, vectors, SafeEncoder.encode(""), params);
}
@@ -322,6 +321,7 @@ public Collection> tvsmknnsearch(byte[] index,
* ef_search range [0, 1000]
* @return Collection<>
*/
+ @Override
public Collection> tvsmknnsearchfilter(final String index, Long topn, Collection vectors, final String pattern, final String... params) {
final List args = new ArrayList();
args.add(SafeEncoder.encode(index));
@@ -334,6 +334,7 @@ public Collection> tvsmknnsearchfilter(final St
return VectorBuilderFactory.STRING_KNN_BATCH_RESULT.build(obj);
}
+ @Override
public Collection> tvsmknnsearchfilter(byte[] index, Long topn, Collection vectors, byte[] pattern, final byte[]... params) {
final List args = new ArrayList();
args.add(index);
@@ -345,4 +346,6 @@ public Collection> tvsmknnsearchfilter(byte[] i
Object obj = jc.sendCommand(index, ModuleCommand.TVSMKNNSEARCH, args.toArray(new byte[args.size()][]));
return VectorBuilderFactory.BYTE_KNN_BATCH_RESULT.build(obj);
}
+
+
}
diff --git a/src/main/java/com/aliyun/tair/tairvector/TairVectorPipeline.java b/src/main/java/com/aliyun/tair/tairvector/TairVectorPipeline.java
index 2103f81..1aae0c2 100644
--- a/src/main/java/com/aliyun/tair/tairvector/TairVectorPipeline.java
+++ b/src/main/java/com/aliyun/tair/tairvector/TairVectorPipeline.java
@@ -1,12 +1,5 @@
package com.aliyun.tair.tairvector;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
import com.aliyun.tair.ModuleCommand;
import com.aliyun.tair.tairhash.factory.HashBuilderFactory;
import com.aliyun.tair.tairvector.factory.VectorBuilderFactory;
@@ -20,6 +13,9 @@
import redis.clients.jedis.ScanResult;
import redis.clients.jedis.util.SafeEncoder;
+import java.util.*;
+import java.util.stream.Collectors;
+
import static redis.clients.jedis.Protocol.toByteArray;
public class TairVectorPipeline extends Pipeline {
diff --git a/src/main/java/com/aliyun/tair/tairvector/TairVectorShard.java b/src/main/java/com/aliyun/tair/tairvector/TairVectorShard.java
new file mode 100644
index 0000000..2fdba65
--- /dev/null
+++ b/src/main/java/com/aliyun/tair/tairvector/TairVectorShard.java
@@ -0,0 +1,350 @@
+package com.aliyun.tair.tairvector;
+
+import com.aliyun.tair.tairvector.factory.VectorBuilderFactory;
+import com.aliyun.tair.tairvector.factory.VectorBuilderFactory.Knn;
+import com.aliyun.tair.tairvector.params.DistanceMethod;
+import com.aliyun.tair.tairvector.params.HscanParams;
+import com.aliyun.tair.tairvector.params.IndexAlgorithm;
+import redis.clients.jedis.ScanResult;
+import redis.clients.jedis.util.JedisClusterCRC16;
+import redis.clients.jedis.util.SafeEncoder;
+
+import java.util.*;
+
+public class TairVectorShard {
+ private VectorShard vectirInstance;
+ private int shardCount;
+
+ public TairVectorShard(VectorShard vectirInstance, int shardCount) {
+ this.vectirInstance = vectirInstance;
+ if (shardCount < 1) {
+ throw new IllegalArgumentException("shards should not be less than 1");
+ }
+ this.shardCount = shardCount;
+ }
+
+ public void quit() {
+ this.vectirInstance.quit();
+ }
+
+ public String tvscreateindex(String index, int dims, IndexAlgorithm algorithm, DistanceMethod method, String... params) {
+ List indexNames = null;
+ indexNames = defaultindexsplit(index, shardCount);
+
+ String result = null;
+ for (String indexName : indexNames) {
+ result = this.vectirInstance.tvscreateindex(indexName, dims, algorithm, method, params);
+ if (!result.equals("OK")) {
+ //TODO delete pre index
+ return result;
+ }
+ }
+ return result;
+ }
+
+ public byte[] tvscreateindex(byte[] index, int dims, IndexAlgorithm algorithm, DistanceMethod method, byte[]... params) {
+ List indexNames = null;
+ indexNames = defaultindexsplit(SafeEncoder.encode(index), shardCount);
+
+ byte[] result = null;
+ for (String indexName : indexNames) {
+ result = this.vectirInstance.tvscreateindex(SafeEncoder.encode(indexName), dims, algorithm, method, params);
+ if (!SafeEncoder.encode(result).equals("OK")) {
+ //TODO delete pre index
+ return result;
+ }
+ }
+ return result;
+ }
+
+ public List