[英]How to search large amount of data based on tags?
我打算創建一個應用程序來排序和查看我擁有的照片和圖像。
我想給程序一個文件夾列表(帶有子文件夾),以便在處理它們時用多個自定義標簽處理和標記圖像。 如果我隨后在搜索欄中輸入一個或多個標簽,我希望所有帶有該標簽的圖像都顯示在面板中。
可行的方法是使用SQL,但我不想在后台運行SQL Server。 我希望該程序具有完全可移植性,因此只需要exe以及它創建的少量文件即可。
我以為我會創建一個樹,其中每個節點都是一個文件夾,葉子是圖像。 然后,我將葉子的標簽添加到父節點並向上級聯,以便根節點具有所有標簽的列表。 這應該允許快速搜索並並行化以快速構建樹。
但是在開始研究這種樹之前,我想知道是否已經有類似的東西,或者是否有更好的方法?
為了清楚起見,我在這里談論的是多個標簽,因此詞典將無法正常工作。
根據定義,標簽是唯一的,因此需要索引和排序。
一個Dictionary<Tag,ImageCollection>
。 為什么不? 似乎是標簽的理想選擇。
Dictionary<Image, TagCollection>
。 上面的反向引用。 您不想嘗試遍歷字典值來獲取鍵。
創建自定義類。 Tag
, Image
, TagCollection
, ImageCollection
; 然后覆蓋Equals
, GetHashCode
,實現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.