Skip to content

Commit 01ce0e1

Browse files
authored
feat(search): print properties for vector field in FT.INFO (#2655)
1 parent 7f1c3f7 commit 01ce0e1

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

src/commands/cmd_search.cc

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,13 +449,31 @@ class CommandFTInfo : public Commander {
449449
output->append(redis::SimpleString("type"));
450450
auto type = field.metadata->Type();
451451
output->append(redis::BulkString(std::string(type.begin(), type.end())));
452-
output->append(redis::SimpleString("options"));
452+
output->append(redis::SimpleString("properties"));
453453
if (auto tag = field.MetadataAs<TagFieldMetadata>()) {
454454
output->append(redis::MultiLen(4));
455455
output->append(redis::SimpleString("separator"));
456456
output->append(redis::BulkString(std::string(1, tag->separator)));
457457
output->append(redis::SimpleString("case_sensitive"));
458458
output->append(conn->Bool(tag->case_sensitive));
459+
} else if (auto vec = field.MetadataAs<HnswVectorFieldMetadata>()) {
460+
output->append(redis::MultiLen(16));
461+
output->append(redis::SimpleString("algorithm"));
462+
output->append(redis::SimpleString("HNSW"));
463+
output->append(redis::SimpleString("vector_type"));
464+
output->append(redis::SimpleString(VectorTypeToString(vec->vector_type)));
465+
output->append(redis::SimpleString("dim"));
466+
output->append(redis::Integer(vec->dim));
467+
output->append(redis::SimpleString("distance_metric"));
468+
output->append(redis::SimpleString(DistanceMetricToString(vec->distance_metric)));
469+
output->append(redis::SimpleString("m"));
470+
output->append(redis::Integer(vec->m));
471+
output->append(redis::SimpleString("ef_construction"));
472+
output->append(redis::Integer(vec->ef_construction));
473+
output->append(redis::SimpleString("ef_runtime"));
474+
output->append(redis::Integer(vec->ef_runtime));
475+
output->append(redis::SimpleString("epsilon"));
476+
output->append(conn->Double(vec->epsilon));
459477
} else {
460478
output->append(redis::MultiLen(0));
461479
}

src/search/search_encoding.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,34 @@ enum class VectorType : uint8_t {
8585
FLOAT64 = 1,
8686
};
8787

88+
inline const char *VectorTypeToString(VectorType type) {
89+
switch (type) {
90+
case VectorType::FLOAT64:
91+
return "FLOAT64";
92+
}
93+
94+
return "unknown";
95+
}
96+
8897
enum class DistanceMetric : uint8_t {
8998
L2 = 0,
9099
IP = 1,
91100
COSINE = 2,
92101
};
93102

103+
inline const char *DistanceMetricToString(DistanceMetric dm) {
104+
switch (dm) {
105+
case DistanceMetric::L2:
106+
return "L2";
107+
case DistanceMetric::IP:
108+
return "IP";
109+
case DistanceMetric::COSINE:
110+
return "COSINE";
111+
}
112+
113+
return "unknown";
114+
}
115+
94116
enum class HnswLevelType : uint8_t {
95117
NODE = 1,
96118
EDGE = 2,

tests/gocase/unit/search/search_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ func TestSearch(t *testing.T) {
6464
require.Equal(t, "index_definition", idxInfo[2])
6565
require.Equal(t, []interface{}{"key_type", "ReJSON-RL", "prefixes", []interface{}{"test1:"}}, idxInfo[3])
6666
require.Equal(t, "fields", idxInfo[4])
67-
require.Equal(t, []interface{}{"identifier", "a", "type", "tag", "options", []interface{}{"separator", ",", "case_sensitive", int64(0)}}, idxInfo[5].([]interface{})[0])
68-
require.Equal(t, []interface{}{"identifier", "b", "type", "numeric", "options", []interface{}{}}, idxInfo[5].([]interface{})[1])
69-
require.Equal(t, []interface{}{"identifier", "c", "type", "vector", "options", []interface{}{}}, idxInfo[5].([]interface{})[2])
67+
require.Equal(t, []interface{}{"identifier", "a", "type", "tag", "properties", []interface{}{"separator", ",", "case_sensitive", int64(0)}}, idxInfo[5].([]interface{})[0])
68+
require.Equal(t, []interface{}{"identifier", "b", "type", "numeric", "properties", []interface{}{}}, idxInfo[5].([]interface{})[1])
69+
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])
7070
}
7171
verify(t)
7272

0 commit comments

Comments
 (0)