This is an automated email from the ASF dual-hosted git repository.

twice pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git


The following commit(s) were added to refs/heads/unstable by this push:
     new 01ce0e10 feat(search): print properties for vector field in FT.INFO 
(#2655)
01ce0e10 is described below

commit 01ce0e104b0d95b967d90a9a082d61535b032d1f
Author: Twice <[email protected]>
AuthorDate: Sun Nov 10 23:24:03 2024 +0800

    feat(search): print properties for vector field in FT.INFO (#2655)
---
 src/commands/cmd_search.cc              | 20 +++++++++++++++++++-
 src/search/search_encoding.h            | 22 ++++++++++++++++++++++
 tests/gocase/unit/search/search_test.go |  6 +++---
 3 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/src/commands/cmd_search.cc b/src/commands/cmd_search.cc
index 7a09885e..75bf08dd 100644
--- a/src/commands/cmd_search.cc
+++ b/src/commands/cmd_search.cc
@@ -449,13 +449,31 @@ class CommandFTInfo : public Commander {
       output->append(redis::SimpleString("type"));
       auto type = field.metadata->Type();
       output->append(redis::BulkString(std::string(type.begin(), type.end())));
-      output->append(redis::SimpleString("options"));
+      output->append(redis::SimpleString("properties"));
       if (auto tag = field.MetadataAs<TagFieldMetadata>()) {
         output->append(redis::MultiLen(4));
         output->append(redis::SimpleString("separator"));
         output->append(redis::BulkString(std::string(1, tag->separator)));
         output->append(redis::SimpleString("case_sensitive"));
         output->append(conn->Bool(tag->case_sensitive));
+      } else if (auto vec = field.MetadataAs<HnswVectorFieldMetadata>()) {
+        output->append(redis::MultiLen(16));
+        output->append(redis::SimpleString("algorithm"));
+        output->append(redis::SimpleString("HNSW"));
+        output->append(redis::SimpleString("vector_type"));
+        
output->append(redis::SimpleString(VectorTypeToString(vec->vector_type)));
+        output->append(redis::SimpleString("dim"));
+        output->append(redis::Integer(vec->dim));
+        output->append(redis::SimpleString("distance_metric"));
+        
output->append(redis::SimpleString(DistanceMetricToString(vec->distance_metric)));
+        output->append(redis::SimpleString("m"));
+        output->append(redis::Integer(vec->m));
+        output->append(redis::SimpleString("ef_construction"));
+        output->append(redis::Integer(vec->ef_construction));
+        output->append(redis::SimpleString("ef_runtime"));
+        output->append(redis::Integer(vec->ef_runtime));
+        output->append(redis::SimpleString("epsilon"));
+        output->append(conn->Double(vec->epsilon));
       } else {
         output->append(redis::MultiLen(0));
       }
diff --git a/src/search/search_encoding.h b/src/search/search_encoding.h
index 26b442ca..bbc84f84 100644
--- a/src/search/search_encoding.h
+++ b/src/search/search_encoding.h
@@ -85,12 +85,34 @@ enum class VectorType : uint8_t {
   FLOAT64 = 1,
 };
 
+inline const char *VectorTypeToString(VectorType type) {
+  switch (type) {
+    case VectorType::FLOAT64:
+      return "FLOAT64";
+  }
+
+  return "unknown";
+}
+
 enum class DistanceMetric : uint8_t {
   L2 = 0,
   IP = 1,
   COSINE = 2,
 };
 
+inline const char *DistanceMetricToString(DistanceMetric dm) {
+  switch (dm) {
+    case DistanceMetric::L2:
+      return "L2";
+    case DistanceMetric::IP:
+      return "IP";
+    case DistanceMetric::COSINE:
+      return "COSINE";
+  }
+
+  return "unknown";
+}
+
 enum class HnswLevelType : uint8_t {
   NODE = 1,
   EDGE = 2,
diff --git a/tests/gocase/unit/search/search_test.go 
b/tests/gocase/unit/search/search_test.go
index b67d1d7f..e93b1dee 100644
--- a/tests/gocase/unit/search/search_test.go
+++ b/tests/gocase/unit/search/search_test.go
@@ -64,9 +64,9 @@ func TestSearch(t *testing.T) {
                        require.Equal(t, "index_definition", idxInfo[2])
                        require.Equal(t, []interface{}{"key_type", "ReJSON-RL", 
"prefixes", []interface{}{"test1:"}}, idxInfo[3])
                        require.Equal(t, "fields", idxInfo[4])
-                       require.Equal(t, []interface{}{"identifier", "a", 
"type", "tag", "options", []interface{}{"separator", ",", "case_sensitive", 
int64(0)}}, idxInfo[5].([]interface{})[0])
-                       require.Equal(t, []interface{}{"identifier", "b", 
"type", "numeric", "options", []interface{}{}}, idxInfo[5].([]interface{})[1])
-                       require.Equal(t, []interface{}{"identifier", "c", 
"type", "vector", "options", []interface{}{}}, idxInfo[5].([]interface{})[2])
+                       require.Equal(t, []interface{}{"identifier", "a", 
"type", "tag", "properties", []interface{}{"separator", ",", "case_sensitive", 
int64(0)}}, idxInfo[5].([]interface{})[0])
+                       require.Equal(t, []interface{}{"identifier", "b", 
"type", "numeric", "properties", []interface{}{}}, 
idxInfo[5].([]interface{})[1])
+                       require.Equal(t, []interface{}{"identifier", "c", 
"type", "vector", "properties", []interface{}{"algorithm", "HNSW", 
"vector_type", "FLOAT64", "dim", int64(3), "distance_metric", "L2", "m", 
int64(16), "ef_construction", int64(200), "ef_runtime", int64(10), "epsilon", 
"0.01"}}, idxInfo[5].([]interface{})[2])
                }
                verify(t)
 

Reply via email to