簡體   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