如何根据标签搜索大量数据?

时间:2017-01-29 16:25:46

标签: c# .net wpf

我计划创建一个应用程序来排序和查看我拥有的照片和图像。

我希望为程序提供一个文件夹列表(包含子文件夹),以便在我浏览时使用多个自定义标记处理和标记图像。如果我在搜索栏中输入一个或多个标签,我希望所有带有该标签的图像都显示在面板中。

转向方法是SQL,但我不希望在后台运行SQL服务器。我希望程序完全可移植,所以只需要exe文件,也可以创建少量文件。

我以为我会创建一个树,其中每个节点都是一个文件夹,而叶子是图像。然后,我会将叶子的标记添加到父节点并向上级联,以便根节点具有所有标记的列表。这应该允许快速搜索和并行化以快速构建树。

但是在我开始研究这样一棵树之前,我想知道是否已有类似的东西,或者是否有更好的方法?

为了说清楚,我在这里谈论多个标签,所以字典不会起作用。

2 个答案:

答案 0 :(得分:0)

按定义标记是唯一的,因此需要进行索引和排序。

A Dictionary<Tag,ImageCollection>。为什么不?似乎是标签的理想选择。

A Dictionary<Image, TagCollection>。以上的反向参考。你不想尝试通过字典值来获取密钥。

创建自定义类。 TagImageTagCollectionImageCollection;然后覆盖EqualsGetHashCode,实施IComparable。这将优化内置的.net索引,排序和搜索。许多集合“查找”方法需要代表进行自定义搜索。请务必阅读MSDN文档。

认为这可能构成核心结构。对于任何给定的查询,使用这些结构的初始提取进行凝视应该非常快。而且产生定制系列也会有所帮助。

混合LINQ和“传统”编码没有任何问题。我希望无论如何你最好使用索引/排序标签。

答案 1 :(得分:0)

以下是我如何处理它。

首先,使用SQLite。它是一个单dll分发,轻量级,超高速和令人印象深刻的数据库,其唯一目的是由这些类型的应用程序使用。数据库是一种比将树木持久保存到文件更好的方法(自定义持久性的问题并不是说这个想法本身就是坏的,而是在那里,而不是那里有十几个边缘情况它会不会出现这种情况。需要处理你不太可能想到数据库自动覆盖它们的位置。)

其次,为您的媒体和标签设置一些POCO。像这样:

abstract class Media
{
    public string Filename {get;set;}

    public virtual ICollection<Tag> Tags {get;set;}
}

public class Image : Media
{
    public ImageFormat Format {get;set;}
    public int ResX {get;set;}
    public int ResY {get;set;}  // or whatever
}

public class Video : Media 
{
    public VideoFormat Format {get;set;}
    public int Bitrate {get;set;}
}



public class Tag
{
    public string Name {get;set;}

    public virtual ICollection<Media> Media {get;set;}
}

这构成了所有MVVM的基础(你使用MVF和WPF,对吧?)

使用Entity Framework进行数据访问(持久性和查询)。

有了这个,您可以执行以下操作来查询您的项目:

public IEnumerable<Media> SearchByTags(List<Tag> tags) {

    var q = from m in _context.Media
            join mt in _context.MediaTags on m.ID = mt.ID
            join t in tags on mt.Name = tag.Name
            select m;

    return q;
}

这将转换为相对优化的数据库查询,并根据您要搜索的标记为您提供适用媒体列表。将此列表反馈到您的演示文稿(MVVM)层,并根据结果构建您的树。

(这假设您有一个媒体表,一个标签表和一个MediaTags的交叉/桥接表 - 我已经留下了许多细节,这是非常多的空气码,但作为一般概念,我觉得它很好用。)