按多个标签搜索数据集

时间:2017-12-13 04:39:43

标签: c++ qt search

也许这个问题的标题有点奇怪,因为我根本不知道我在寻找什么。

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

  

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

这是一个电影示例:

"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:搜索视频......
  • 亚马逊:搜索“tv”,但“tv”不必在标题中。

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

有谁能让我知道我在寻找什么,也许我可以如何实现这一点?我在Qt中使用c ++。我不知道Qt能否以任何方式帮助我。

编辑:我可以像这样添加所有关键字:

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

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

但这是一个很好的解决方案吗?如果我想优先考虑标题中的匹配,该怎么办?

2 个答案:

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