繁体   English   中英

如何基于标签搜索大量数据?

[英]How to search large amount of data based on tags?

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

我想给程序一个文件夹列表(带有子文件夹),以便在处理它们时用多个自定义标签处理和标记图像。 如果我随后在搜索栏中输入一个或多个标签,我希望所有带有该标签的图像都显示在面板中。

可行的方法是使用SQL,但我不想在后台运行SQL Server。 我希望该程序具有完全可移植性,因此只需要exe以及它创建的少量文件即可。

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

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

为了清楚起见,我在这里谈论的是多个标签,因此词典将无法正常工作。

根据定义,标签是唯一的,因此需要索引和排序。

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

Dictionary<Image, TagCollection> 上面的反向引用。 您不想尝试遍历字典值来获取键。

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

认为这可能构成核心结构。 对于任何给定的查询,盯着这些结构的初始提取都应该很快。 产生自定义集合也将有所帮助。

LINQ和“传统”编码的混合并没有错。 我希望无论如何都最好使用索引/排序标签。

这是我的处理方式。

首先,使用SQLite。 它是一个单一dll分发,轻量级,超快速且功能强大的数据库,其唯一目的是供这些类型的应用程序使用。 与尝试将树持久保存到文件相比,数据库是一种更好的方法(自定义持久性的问题并不在于它本身的想法不好,而是要解决一堆边缘情况,而不是一dozen而就的问题)不太可能想到数据库会自动覆盖它们的位置)。

其次,为您的媒体和标签设置一些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的基础(您正在将MVVM与WPF一起使用,对吗?)

使用实体框架进行数据访问(持久性和查询)。

这样,您可以执行以下操作来查询商品:

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)层,并根据结果构建树。

(这假设您有一个Media表,一个Tag表和一个MediaTags交界/桥表-我省略了很多细节,这是很多空代码,但是作为一个一般概念,我认为它可以正常工作精细)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM