Skip to content

Commit fa506f0

Browse files
fix delete fulltext index (#5239)
* fix delete fulltext index * fix es delete error 1. remove get Rowreader if op is delete 2. delete es data when value is null Co-authored-by: Sophie <84560950+Sophie-Xie@users.noreply.github.com>
1 parent f6a44b4 commit fa506f0

File tree

1 file changed

+49
-43
lines changed

1 file changed

+49
-43
lines changed

src/kvstore/listener/elasticsearch/ESListener.cpp

+49-43
Original file line numberDiff line numberDiff line change
@@ -73,41 +73,36 @@ void ESListener::pickTagAndEdgeData(BatchLogType type,
7373
const std::string& key,
7474
const std::string& value,
7575
const PickFunc& callback) {
76+
bool isTag = nebula::NebulaKeyUtils::isTag(vIdLen_, key);
77+
bool isEdge = nebula::NebulaKeyUtils::isEdge(vIdLen_, key);
78+
if (!(isTag || isEdge)) {
79+
return;
80+
}
81+
std::unordered_map<std::string, nebula::meta::cpp2::FTIndex> ftIndexes;
82+
nebula::RowReaderWrapper reader;
83+
84+
std::string vid;
85+
std::string src;
86+
std::string dst;
87+
int rank = 0;
7688
if (nebula::NebulaKeyUtils::isTag(vIdLen_, key)) {
7789
auto tagId = NebulaKeyUtils::getTagId(vIdLen_, key);
7890
auto ftIndexRes = schemaMan_->getFTIndex(spaceId_, tagId);
7991
if (!ftIndexRes.ok()) {
8092
LOG(ERROR) << ftIndexRes.status().message();
8193
return;
8294
}
83-
auto ftIndex = std::move(ftIndexRes).value();
84-
if (ftIndex.empty()) {
85-
return;
86-
}
87-
auto reader = RowReaderWrapper::getTagPropReader(schemaMan_, spaceId_, tagId, value);
88-
if (reader == nullptr) {
89-
LOG(ERROR) << "get tag reader failed, tagID " << tagId;
90-
return;
91-
}
92-
for (auto& index : ftIndex) {
93-
if (index.second.get_fields().size() > 1) {
94-
LOG(ERROR) << "Only one field will create fulltext index";
95-
}
96-
auto field = index.second.get_fields().front();
97-
auto v = reader->getValueByName(field);
98-
if (v.type() == Value::Type::NULLVALUE) {
99-
continue;
100-
}
101-
if (v.type() != Value::Type::STRING) {
102-
LOG(ERROR) << "Can't create fulltext index on type " << v.type();
95+
ftIndexes = std::move(ftIndexRes).value();
96+
if (type == BatchLogType::OP_BATCH_PUT) {
97+
reader = RowReaderWrapper::getTagPropReader(schemaMan_, spaceId_, tagId, value);
98+
if (reader == nullptr) {
99+
LOG(ERROR) << "get tag reader failed, tagID " << tagId;
100+
return;
103101
}
104-
std::string indexName = index.first;
105-
std::string vid = NebulaKeyUtils::getVertexId(vIdLen_, key).toString();
106-
vid = truncateVid(vid);
107-
std::string text = std::move(v).getStr();
108-
callback(type, indexName, vid, "", "", 0, text);
109102
}
110-
} else if (nebula::NebulaKeyUtils::isEdge(vIdLen_, key)) {
103+
vid = NebulaKeyUtils::getVertexId(vIdLen_, key).toString();
104+
vid = truncateVid(vid);
105+
} else {
111106
auto edgeType = NebulaKeyUtils::getEdgeType(vIdLen_, key);
112107
if (edgeType < 0) {
113108
return;
@@ -116,33 +111,44 @@ void ESListener::pickTagAndEdgeData(BatchLogType type,
116111
if (!ftIndexRes.ok()) {
117112
return;
118113
}
119-
auto ftIndex = std::move(ftIndexRes).value();
120-
auto reader = RowReaderWrapper::getEdgePropReader(schemaMan_, spaceId_, edgeType, value);
121-
if (reader == nullptr) {
122-
LOG(ERROR) << "get edge reader failed, schema ID " << edgeType;
123-
return;
124-
}
125-
for (auto& index : ftIndex) {
126-
if (index.second.get_fields().size() > 1) {
127-
LOG(ERROR) << "Only one field will create fulltext index";
114+
ftIndexes = std::move(ftIndexRes).value();
115+
if (type == BatchLogType::OP_BATCH_PUT) {
116+
reader = RowReaderWrapper::getEdgePropReader(schemaMan_, spaceId_, edgeType, value);
117+
if (reader == nullptr) {
118+
LOG(ERROR) << "get edge reader failed, schema ID " << edgeType;
119+
return;
128120
}
121+
}
122+
src = NebulaKeyUtils::getSrcId(vIdLen_, key).toString();
123+
dst = NebulaKeyUtils::getDstId(vIdLen_, key).toString();
124+
rank = NebulaKeyUtils::getRank(vIdLen_, key);
125+
126+
src = truncateVid(src);
127+
dst = truncateVid(dst);
128+
}
129+
if (ftIndexes.empty()) {
130+
return;
131+
}
132+
133+
for (auto& index : ftIndexes) {
134+
if (index.second.get_fields().size() > 1) {
135+
LOG(ERROR) << "Only one field will create fulltext index";
136+
}
137+
std::string text;
138+
std::string indexName = index.first;
139+
if (type == BatchLogType::OP_BATCH_PUT) {
129140
auto field = index.second.get_fields().front();
130141
auto v = reader->getValueByName(field);
131142
if (v.type() == Value::Type::NULLVALUE) {
143+
callback(BatchLogType::OP_BATCH_REMOVE, indexName, vid, src, dst, 0, text);
132144
continue;
133145
}
134146
if (v.type() != Value::Type::STRING) {
135147
LOG(ERROR) << "Can't create fulltext index on type " << v.type();
136148
}
137-
std::string indexName = index.first;
138-
std::string src = NebulaKeyUtils::getSrcId(vIdLen_, key).toString();
139-
std::string dst = NebulaKeyUtils::getDstId(vIdLen_, key).toString();
140-
int64_t rank = NebulaKeyUtils::getRank(vIdLen_, key);
141-
std::string text = std::move(v).getStr();
142-
src = truncateVid(src);
143-
dst = truncateVid(dst);
144-
callback(type, indexName, "", src, dst, rank, text);
149+
text = std::move(v).getStr();
145150
}
151+
callback(type, indexName, vid, src, dst, rank, text);
146152
}
147153
}
148154

0 commit comments

Comments
 (0)