通过多个标签搜索数据集



也许这个问题的标题有些奇怪,因为我只是不知道自己在寻找什么。

我有一些数据,例如与之关联的字符串和多个标签。现在,我希望能够使用字符串搜索我的数据。

编辑:问题不是字符串比较或子字符串 搜索!问题是从结果到数据的连接 对象。

在这里一个电影示例:

"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"

其他示例:

  • YouTube:搜索视频...
  • 亚马逊:搜索"电视",但"电视"不必在标题中。

我唯一的想法是指向所有可能性列表的多图像。然后,我必须将搜索字符串与所有键和TADA进行比较。但是我不敢相信这是一个很好的解决方案,因为我会有大量清单...

谁能让我了解我要寻找的东西,也许我如何实施它?我将C 与QT一起使用。我不知道QT是否可以以任何方式帮助我。

编辑:我可以将所有关键字添加在一起:

"Title1 genre1 genre2 actor1 actor2"
"Title2 genre2 actor2 actor3"
"Title3 genre2 genre3 actor1 actor3"

用此键创建一个映射到数据对象。然后,我只需要进行字符串搜索并获取所有字符串,而搜索字符串是键的子字符串。

但是这是一个很好的解决方案吗?如果我想优先考虑标题中的比赛?

如果它有很多数据,或者您希望将数据迁移到另一台计算机,那么我会选择QT内置的SQL功能。

Severel一个月后,我决定再次处理这个问题,最后,我有了一个解决方案。我花了〜4小时才能使一切正常。我现在在QT中使用sqlite使用toxi标记。我从这篇文章中有这个想法,也研究了其他可能性。这是一个具有数值选项和小比较的页面:链接

这是我的解决方案:创建数据库并为其添加值。然后,您可以这样做一个简单的子字符串搜索:

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

Sidenote:如果您的标签列表确实很大,则使用FTS3或FTS4可能是有益的。这是更多信息。

创建数据库:

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();
    }
}

最新更新