也许这个问题的标题有点奇怪,因为我根本不知道我在寻找什么。
我有一些数据,例如一个字符串和与之关联的多个标签。现在我希望能够用字符串搜索我的数据。
编辑:问题不是字符串比较或子字符串 搜索!问题是从结果到数据的连接 对象
这是一个电影示例:
"Title1" tags: "genre1" "genre2" "actor1" "actor2"
"Title2" tags: "genre2" "actor2" "actor3"
"Title3" tags: "genre2" "genre3" "actor1" "actor3"
Search for "genre2" -> "Title1", "Title2", "Title3"
Search for "Title1" -> "Title1"
Serach for "actor1" -> "Title1", "Title3"
其他例子:
我唯一想到的是一个指向所有可能性列表的多图。然后我必须将搜索字符串与所有键和tada进行比较。但我无法相信这是一个很好的解决方案,因为我会有一个疯狂的名单......
有谁能让我知道我在寻找什么,也许我可以如何实现这一点?我在Qt中使用c ++。我不知道Qt能否以任何方式帮助我。
编辑:我可以像这样添加所有关键字:
"Title1 genre1 genre2 actor1 actor2"
"Title2 genre2 actor2 actor3"
"Title3 genre2 genre3 actor1 actor3"
使用此键为数据对象创建一个映射。然后我只需要进行字符串搜索并获取所有字符串,其中搜索字符串是键的子字符串。
但这是一个很好的解决方案吗?如果我想优先考虑标题中的匹配,该怎么办?
答案 0 :(得分:1)
如果它有很多数据,或者您希望将数据迁移到另一台计算机,我会使用Qt的内置SQL功能。
答案 1 :(得分:0)
Severel一个月后,我决定再次解决这个问题,最后,我有一个解决方案。我花了大约4个小时才能完成所有工作。我现在在Qt中使用带有SQLite的Toxi-Tagging。我从this post得到了这个想法,并且还考虑了其他可能性。这是一个包含多个选项和小比较的页面:Link
这是我的解决方案: 创建数据库并向其添加值。然后你可以这样做一个简单的子字符串搜索:
SELECT Data.* FROM Data
INNER JOIN DataTag ON DataTag.DataID=Data.ID
INNER JOIN Tag ON DataTag.TagID=Tag.ID WHERE Tag.Tag LIKE "%substring%"
GROUP BY Data.ID
旁注:如果你的标签列表非常大,那么使用FTS3或FTS4可能是有益的。这是more info。
创建数据库:
QString scom;
QSqlQuery query;
scom = "CREATE TABLE Data ("
"ID INTEGER PRIMARY KEY,"
"Data1 VARCHAR(120) NOT NULL UNIQUE,"
"Data2 INTEGER NOT NULL,"
"Data3 INTEGER NOT NULL);";
if(!query.exec(scom))
{
qDebug() << "Error creating table Data";
}
scom = "CREATE TABLE Tag ("
"ID INTEGER PRIMARY KEY,"
"Tag VARCHAR(120) NOT NULL UNIQUE);";
if(!query.exec(scom))
{
qDebug() << "Error creating table Tag";
}
scom = "CREATE TABLE DataTag ("
"DataID INTEGER,"
"TagID INTEGER,"
"FOREIGN KEY(DataID) REFERENCES Data(ID)"
"FOREIGN KEY(TagID) REFERENCES Tag(ID));";
if(!query.exec(scom))
{
qDebug() << "Error creating table DataTag";
}
scom = "CREATE UNIQUE INDEX index_name ON Tag (Tag)";
if(!query.exec(scom))
{
qDebug() << "Error could not create index on Tag Tag";
}
向数据库添加值:
QString scomadddata, scomaddtag, scomadddatatag, scomsearchtag;
QSqlQuery query;
scomadddata = "INSERT INTO Data (ID, Data1, Data2, Data3) "
"VALUES (NULL, ?, ?, ?)";
query.prepare(scomadddata);
query.addBindValue(data1);
query.addBindValue(data2);
query.addBindValue(data3);
if(!query.exec())
{
qDebug() << "Error adding values to Data";
qDebug() << query.lastError();
}
QVariant dataid = query.lastInsertId();
scomsearchtag = "SELECT ID FROM Tag WHERE Tag = ";
scomaddtag = "INSERT INTO Tag (ID, Tag) VALUES (NULL, ?)";
scomadddatatag = "INSERT INTO DataTag (DataID, TagID) VALUES (?, ?)";
for(int i = 0; i < tags.count(); ++i)
{
QVariant tagid;
// Search if Tag allready exists
if(!query.exec(scomsearchtag + "\"" + tags[i] + "\""))
{
qDebug() << "Error searching for Tag";
qDebug() << query.lastError();
}
if(query.next())
{
tagid = query.value(0);
}
else
{
// Add Tag to Tag Table
query.prepare(scomaddtag);
query.addBindValue(tags[i]);
if(!query.exec())
{
qDebug() << "Error adding values to Tag";
qDebug() << query.lastError();
continue;
}
// Get Tag ID
tagid = query.lastInsertId();
}
// Link Tag ID with Data ID
query.prepare(scomadddatatag);
query.addBindValue(dataid);
query.addBindValue(tagid);
if(!query.exec())
{
qDebug() << "Error adding values to DataTag";
qDebug() << query.lastError();
}
}