在本地图像文件夹中使用c#搜索图像

在本地图像文件夹中使用c#搜索图像,c#,.net,search,C#,.net,Search,我们有一个图片文件夹,里面有大约一百万张图片。 我们需要编写一个程序,根据用户输入的关键字获取图像。 我们需要在搜索时匹配文件名以找到正确的图像。 寻找任何建议。 谢谢 N 将图像保留在单独的站点或子域上。当然,您可能不希望所有1M文件都位于一个目录中 您需要一个包含(至少)三个表的数据库: 图像文件 身份证件 文件路径 关键词 身份证件 这个词 图像关键字 图像ID 关键字ID 将所有(图像和关键字)存储在数据库中 您可以使用全文索引来搜索单词,或者将每个单词存储为单独的条目 而且,您可以更快

我们有一个图片文件夹,里面有大约一百万张图片。 我们需要编写一个程序,根据用户输入的关键字获取图像。 我们需要在搜索时匹配文件名以找到正确的图像。 寻找任何建议。 谢谢 N

  • 将图像保留在单独的站点或子域上。当然,您可能不希望所有1M文件都位于一个目录中

  • 您需要一个包含(至少)三个表的数据库:

  • 图像文件 身份证件 文件路径 关键词 身份证件 这个词 图像关键字 图像ID 关键字ID 将所有(图像和关键字)存储在数据库中

    您可以使用全文索引来搜索单词,或者将每个单词存储为单独的条目

    而且,您可以更快地访问元数据(文件名、创建日期等),而无需检索(或打开)图像本身


    这可能比依赖一个文件系统要快得多,该文件系统不需要在单个文件夹中存储一百万个条目。

    有Win32 API FindFirstFile、FindNextFile和FindClose:-可能它们也以某种方式映射到.NET。使用它们在没有任何数据库的情况下搜索图像。

    从文件夹中获取一百万个文件名将花费大量时间。我建议您获取文件名并将其放入数据库。这样,你就可以在几秒钟内而不是几分钟内搜索这些名称。

    对于如此大量的图像,我的第一个想法是创建一个倒排列表,用作索引

    如果你能够维护这个列表,它将使搜索相对快速,你就不必浏览一百万张图片,我猜这对你来说太耗时了


    首先,我要寻找一些倒排列表实现。

    这是显而易见的,但可以想象,对于一百万张图像来说,这会非常缓慢:

    public IList<string> GetMatchingImages(string path, string keyword)
        {
            var matches = new List<string>();
    
            var images = System.IO.Directory.GetFiles(path);
    
            foreach (var image in images)
            {
                if (image.Contains(keyword))
                {
                    matches.Add(image);
                }
            }
    
            return matches;
        }
    
    public IList GetMatchingImages(字符串路径,字符串关键字)
    {
    var matches=新列表();
    var images=System.IO.Directory.GetFiles(路径);
    foreach(图像中的var图像)
    {
    if(image.Contains(关键字))
    {
    匹配。添加(图像);
    }
    }
    返回比赛;
    }
    
    一个简单的解决方案是一个数据库,其中存储了一个ID、路径和一个varchar(string)字段,您将在其中保留所有关键字。(为了提高效率,可以将其存储在不同的表中)


    通过这种方式,您可以按文件名或与图像关联的关键字进行搜索。

    根据操作系统的不同,我建议您使用索引服务、Windows桌面搜索或最新版本的Windows搜索。这解决了基于关键字的文件查找问题,解决了与文件夹中文件数量有关的性能问题,具有可扩展性,并且易于扩展

    位于的DSearch示例几乎完全满足您的需要,并且易于实现

    例如,如果查询一百万个文件并需要将文件移动到子文件夹中以提高性能,则只需创建文件夹并移动文件即可。您不需要更改任何代码

    如果需要更改关键字的应用方式,例如使用文件摘要属性的关键字,则只需更改查询

    对于更高版本的操作系统,您甚至不需要安装任何软件,因为搜索功能是操作系统的一部分,可通过OleDB获得。如果您想使用高级查询语法(AQS),Microsoft提供了一个类型库来访问COM接口,从而可以轻松地生成查询索引数据库的SQL命令

    老实说,所有这些关于数据库等的建议都是浪费时间

    • MSDN搜索windows search位于

    • 与Windows Search相关的搜索技术

    • 在一个文件夹中搜索一百万个文件的速度会非常慢。(有关目录文件大小计算-如何使其更快?请参阅我在的回复。)

    • 我可以在大约300000个文件的硬盘上搜索*tabcontrol.cs“在不到一秒钟的时间内,第一次查询大约需要4000ms,每次查询使用不同的搜索词,在第一次查询之后需要300-600ms

      • 我刚刚从“索引服务”更新为“Windows搜索”,我可以在1.25秒内搜索超过58GB的300000个文件,搜索“filename:tabcontrol”,后续搜索需要0.13到0.26秒
    • 请参阅上的DSearch示例,了解实现此功能的容易程度

    • “搜索桌面”位于

      在硬盘上搜索文件是一项缓慢而繁琐的操作。了解如何利用Windows桌面搜索API和数据库快速查找文件。使用Vista内置的搜索功能和Windows XP提供的搜索功能,为应用程序添加创新的新功能


    只需将所有图像重命名为它们各自的关键字,并用空格分隔。然后使用操作系统自己的搜索功能


    如果这不起作用,那就去找更高级的解决方案。

    除此之外,你还可以对图像进行散列,以便检查图像是否确实存在。不要使用MD5,因为它可以为不同的文件生成相同的结果-尝试SHA1或更高版本。@Dominic:当然。你认为哪种应用程序会从中受益?@Dominic Zukiewicz:“不要使用MD5,而是使用SHA-1"?!很好,MD5是128位,SHA-1是160位,但是给SHA-1输入任何大于80字节的内容最终都会导致冲突。说SHA-1永远不会产生冲突只是愚蠢的空谈。如果你想检查数据库中是否已经存在确切的文件,哈希将有所帮助。但我是说,某些算法已经为pr所知为完全不同的文件使用相同的密钥。@Patrick-我很感激这些算法
    public IList<string> GetMatchingImages(string path, string keyword)
        {
            var matches = new List<string>();
    
            var images = System.IO.Directory.GetFiles(path);
    
            foreach (var image in images)
            {
                if (image.Contains(keyword))
                {
                    matches.Add(image);
                }
            }
    
            return matches;
        }