diff --git a/src/planner/Maintain.h b/src/planner/Maintain.h
index f28a8e61bfe176d25c48cb221c1e0908ca860c06..55e7c8989c90b52cddd888b8f31f96f4501de76a 100644
--- a/src/planner/Maintain.h
+++ b/src/planner/Maintain.h
@@ -434,7 +434,7 @@ private:
                    std::vector<std::string> fields,
                    bool ifNotExists)
         : CreateIndexNode(id, input,
-                          Kind::kCreateEdge,
+                          Kind::kCreateTagIndex,
                           std::move(tagName),
                           std::move(indexName),
                           std::move(fields),
@@ -464,7 +464,7 @@ private:
                     std::vector<std::string> fields,
                     bool ifNotExists)
         : CreateIndexNode(id, input,
-                          Kind::kCreateEdge,
+                          Kind::kCreateEdgeIndex,
                           std::move(edgeName),
                           std::move(indexName),
                           std::move(fields),
diff --git a/src/validator/MaintainValidator.cpp b/src/validator/MaintainValidator.cpp
index af10e4732f099a681afbeb744bf09ce1dd8484c6..b8f246b65eaf2f044efe911d665e6aa451005698 100644
--- a/src/validator/MaintainValidator.cpp
+++ b/src/validator/MaintainValidator.cpp
@@ -321,10 +321,14 @@ Status CreateTagIndexValidator::validateImpl() {
 
     auto status = Status::OK();
     do {
-        auto schema = vctx_->getSchema(name_);
-        if (schema == nullptr) {
-            status = Status::Error("Tag %s not exist", name_.c_str());
-            break;
+        auto tagStatus = qctx_->schemaMng()->toTagID(space_.id, name_);
+        if (!tagStatus.ok()) {
+            return tagStatus.status();
+        }
+
+        auto schema_ = qctx_->schemaMng()->getTagSchema(space_.id, tagStatus.value());
+        if (schema_ == nullptr) {
+            return Status::Error("No schema found for '%s'", name_.c_str());
         }
 
         status = IndexUtil::validateColumns(fields_);
@@ -359,10 +363,14 @@ Status CreateEdgeIndexValidator::validateImpl() {
 
     auto status = Status::OK();
     do {
-        auto schema = vctx_->getSchema(name_);
-        if (schema == nullptr) {
-            status = Status::Error("Edge %s not exist", name_.c_str());
-            break;
+        auto edgeStatus = qctx_->schemaMng()->toEdgeType(space_.id, name_);
+        if (!edgeStatus.ok()) {
+            return edgeStatus.status();
+        }
+
+        auto schema_ = qctx_->schemaMng()->getEdgeSchema(space_.id, edgeStatus.value());
+        if (schema_ == nullptr) {
+            return Status::Error("No schema found for '%s'", name_.c_str());
         }
 
         status = IndexUtil::validateColumns(fields_);
diff --git a/src/validator/Validator.cpp b/src/validator/Validator.cpp
index da972edccab00328bcdd6c6ded4d185231defb9c..f54d58b1acab6c286aac4460ee550f1e7a4dbd2f 100644
--- a/src/validator/Validator.cpp
+++ b/src/validator/Validator.cpp
@@ -164,8 +164,6 @@ std::unique_ptr<Validator> Validator::makeValidator(Sentence* sentence, QueryCon
             return std::make_unique<ShowConfigsValidator>(sentence, context);
         case Sentence::Kind::kFindPath:
             return std::make_unique<FindPathValidator>(sentence, context);
-        case Sentence::Kind::kMatch:
-        case Sentence::Kind::kUnknown:
         case Sentence::Kind::kCreateTagIndex:
             return std::make_unique<CreateTagIndexValidator>(sentence, context);
         case Sentence::Kind::kShowCreateTagIndex:
@@ -190,6 +188,8 @@ std::unique_ptr<Validator> Validator::makeValidator(Sentence* sentence, QueryCon
             return std::make_unique<RebuildEdgeIndexValidator>(sentence, context);
         case Sentence::Kind::kDropEdgeIndex:
             return std::make_unique<DropEdgeIndexValidator>(sentence, context);
+        case Sentence::Kind::kMatch:
+        case Sentence::Kind::kUnknown:
         case Sentence::Kind::kLookup:
         case Sentence::Kind::kDownload:
         case Sentence::Kind::kIngest: