三.關于搜尋部分
1想建立索引。建構jpg圖檔解析器,在索引時将jpg圖檔的exif資訊及其文本資訊如名稱,存放路徑,大小,日期等等加入索引!具體實作代碼如下:
public void BulidIndex(string path)//建立索引
{
DateTime biStart = DateTime.Now;//建立索引開始
DirectoryInfo[] ChildDirectory;//子目錄集
FileInfo[] files;//目前所有檔案
DirectoryInfo FatherDirectory = new DirectoryInfo(path); //目前目錄
ChildDirectory = FatherDirectory.GetDirectories("*.*"); //得到子目錄集
files = FatherDirectory.GetFiles("*.jpg");//得到jpg檔案集,可以進行操作
Analyzer analyzer = new MyAnalyzer();//聲明一個分詞器,
IndexWriter indexWriter = new IndexWriter("index", analyzer, true);/*建立一個IndexWriter的執行個體,這個類是負責建立索引的,有很多構造函數,這裡使用的是其中的一個。三個參數分别是:索引建立到哪個目錄,用什麼分詞器,還有就是是否建立。如果是否建立為false,那麼就是以增量的方式來建立。*/
for (int i = 0; i
{
string maker = "unkown", explord = "unkown",
iso = "unkown", aperture = "unkown", focalLength="unkown";
Document doc = new Document();//聲明一個document并将圖檔的名稱,存放路徑,大小,日期,
相機制造商,曝光度,ISO,焦距,光圈值依次通過field 添加入document中。
FindExifinfo(files[i].FullName, ref maker, ref explord, ref iso, ref focalLength, ref aperture);
doc.Add(new Field("Name", files[i].Name, Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("FullName", files[i].FullName, Field.Store.YES, Field.Index.NO));
doc.Add(new Field("Length", files[i].Length.ToString(), Field.Store.YES, Field.Index.NO));
doc.Add(new Field("LastWriteTime", files[i].LastWriteTime.ToString(), Field.Store.YES, Field.Index.NO));
doc.Add(new Field("CreationTime", files[i].CreationTime.ToString(), Field.Store.YES, Field.Index.NO));
doc.Add(new Field("Maker", maker, Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("Explord", explord, Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("ISO", iso, Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("FocalLength", focalLength, Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("Aperture", aperture, Field.Store.YES, Field.Index.UN_TOKENIZED));
indexWriter.AddDocument(doc); /*調用了AddDocument方法,在AddDocument方法中,先組織一個Docuement對象,然後把這個對象交給IndexWriter*/
}
indexWriter.Optimize();//Optimize優化索引
indexWriter.Close();//最後關閉建立過程
DateTime biStop = DateTime.Now;//建立索引結束
this.status1.Text = "建立索引用時:" + (biStop - biStart).TotalSeconds + "秒";
}
2 執行搜尋并擷取結果:
private void button1_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
Hits hits = null;
Query query = null;
Analyzer analyzer = new MyAnalyzer();
DateTime Start = DateTime.Now;//索引開始時間
string TEXT= this.tbkey.Text;
BooleanQuery BQ = new BooleanQuery( ); //使用Boolean 查詢
if (TEXT == "")
return;
try
switch (this.comboBox1.SelectedIndex)
{
case 0:
QueryParser parser = new QueryParser("Name", analyzer);
query = parser.Parse(tbkey.Text);
break;
case 1: //使用Boolean 查詢 含有某個關鍵詞或其他關鍵詞 should 表示“或”的關系
Term T2 = new Term("Maker", TEXT);
TermQuery q2 = new TermQuery(T2);
BQ.Add(q2, BooleanClause.Occur.SHOULD);
case 2: //按照片的ISO速率進行搜尋
Term T3 = new Term("ISO", TEXT);
TermQuery q3 = new TermQuery(T3);
BQ.Add(q3, BooleanClause.Occur.SHOULD);
case 3: //按照片的 曝光度進行搜尋
Term T4 = new Term("Explord", TEXT);
TermQuery q4 = new TermQuery(T4);
BQ.Add(q4, BooleanClause.Occur.SHOULD);
case 4: //按照片的 焦距進行搜尋
Term T5 = new Term("FocalLength", TEXT);
TermQuery q5 = new TermQuery(T5);
BQ.Add(q5, BooleanClause.Occur.SHOULD);
case 5: //按照片的光圈進行搜尋
Term T6 = new Term("Aperture", TEXT);
TermQuery q6 = new TermQuery(T6);
BQ.Add(q6, BooleanClause.Occur.SHOULD);
default: break;
}
catch (Exception)
throw;
IndexSearcher searcher = new IndexSearcher("index");
if (searcher != null)
if( 0 == this.comboBox1.SelectedIndex) //使用if語句對搜尋方式進行分類,如果是按照相片或圖檔名稱進行搜尋則進行關鍵字比對查詢
hits = searcher.Search(query);
else
hits = searcher.Search(BQ); //如果不是按名稱搜尋,則進行嚴格比對查詢搜尋!
if (hits.Length() > 0)
this.status1.Text = " 共檢索 " + hits.Length().ToString() + "個對象";
this.imageList.Images.Clear();
for (int i = 0; i
{ //将搜尋結果分别添加入listview和imagelist中,此過程比較耗時間!無奈!!!
Document doc = hits.Doc(i);
int itemNumber = this.listView1.Items.Count;
//string fullname = doc.Get("FullName");
string[] subItem = { doc.Get("Name"), doc.Get("FullName"), (Convert.ToInt32(doc.Get("Length")) <b>>> </b>10).ToString() + "KB", doc.Get("LastWriteTime") }; //使用右移 加快程式的執行速度!
this.imageList.Images.Add(doc.Get("FullName"), Bitmap.FromFile(doc.Get("FullName")));
this.listView1.Items.Add(new ListViewItem(subItem, doc.Get("FullName")));//顯示結果較慢的元兇!
else
this.status1.Text = " 共檢索 0 個對象";
DateTime Stop = DateTime.Now;//索引完成時間
this.status1.Text += " 搜尋用時:" + (Stop - Start).TotalSeconds + "秒";