关于搜索部分

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 = ; i < files.Length; 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 + "秒";

        }

 执行搜索并获取结果:

 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 :

                        QueryParser parser = new QueryParser("Name", analyzer);

                        query = parser.Parse(tbkey.Text);

                        break;

                    case : //使用Boolean 查询 含有某个关键词或其他关键词 should 表示“或”的关系

                        Term T2 = new Term("Maker", TEXT);

                        TermQuery q2 = new TermQuery(T2);

                        BQ.Add(q2, BooleanClause.Occur.SHOULD);

                        break;

                    case : //按照片的ISO速率进行搜索

                        Term T3 = new Term("ISO", TEXT);

                        TermQuery q3 = new TermQuery(T3);

                        BQ.Add(q3, BooleanClause.Occur.SHOULD);

                        break;

                    case : //按照片的 曝光度进行搜索

                        Term T4 = new Term("Explord", TEXT);

                        TermQuery q4 = new TermQuery(T4);

                        BQ.Add(q4, BooleanClause.Occur.SHOULD);

                        break;

                    case : //按照片的 焦距进行搜索

                        Term T5 = new Term("FocalLength", TEXT);

                        TermQuery q5 = new TermQuery(T5);

                        BQ.Add(q5, BooleanClause.Occur.SHOULD);

                        break;

                    case : //按照片的光圈进行搜索

                        Term T6 = new Term("Aperture", TEXT);

                        TermQuery q6 = new TermQuery(T6);

                        BQ.Add(q6, BooleanClause.Occur.SHOULD);

                        break;

                    default: break;

                }

            }

            catch (Exception)

            {

                throw;

            }

            IndexSearcher searcher = new IndexSearcher("index");

            if (searcher != null)

            {

                if(  == this.comboBox1.SelectedIndex) //使用if语句对搜索方式进行分类,如果是按照相片或图片名称进行搜索则进行关键字匹配查询

                    hits = searcher.Search(query);

                else

                    hits = searcher.Search(BQ); //如果不是按名称搜索,则进行严格匹配查询搜索!

                if (hits.Length() > )

                {

                    this.status1.Text = "  共检索 " + hits.Length().ToString() + "个对象";

                }

                this.imageList.Images.Clear();

                for (int i = ; i < hits.Length(); 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")) >>).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 + "秒";

http://blog.csdn.net/yang073402/article/details/5470153

lucene .NET 搜索图片 功能实现的更多相关文章

  1. lucene全文搜索之一:lucene的主要功能和基本结构(基于lucene5.5.3)

    前言:lucene并不是像solr或elastic那样提供现成的.直接部署可用的系统,而是一套jar包,提供了一些常见语言分词.构建索引和创建搜索器等等功能的API,我们常用到的也就是分词器.索引目录 ...

  2. Lucene.net常用功能说明

    Lucene.net是一个.net下的全文检索类库.配置简单,功能丰富,比较成熟.我在项目中用Lucene.net有一段时间了,这里我把常用一些功能写出来,与大家一起分享. Lucene.net用的是 ...

  3. Lucene.net常见功能实现知识汇总

    在开发SearchEasy Site SearchEngine(搜易站内搜索引擎)的时候,经常会遇到一些搜索引擎的常见功能如何实现的问题,比如实现相关度百分比显示?如何实现在结果中搜索等等诸如此类常见 ...

  4. 如何使用 Lucene 做网站高亮搜索功能?

    现在基本上所有网站都支持搜索功能,现在搜索的工具有很多,比如Solr.Elasticsearch,它们都是基于 Lucene 实现的,各有各的使用场景.Lucene 比较灵活,中小型项目中使用的比较多 ...

  5. 【Lucene】Apache Lucene全文检索引擎架构之搜索功能3

    上一节主要总结了一下Lucene是如何构建索引的,这一节简单总结一下Lucene中的搜索功能.主要分为几个部分,对特定项的搜索:查询表达式QueryParser的使用:指定数字范围内搜索:指定字符串开 ...

  6. tantivy&lucene功能,写入性能对比

    硬件概述:cpu:24,内存:20g,磁盘:10*2.7T. 写入性能:(不对ip进行添加geo信息). 写入性能对比 速度 Commit耗时(秒) 500*1000条 Bulk耗时(秒) 1000条 ...

  7. Lucene 4.x Spellcheck使用说明

    Spellcheck是Lucene新版本的功能,在介绍spellcheck之前,我们需要弄清楚Spellcheck支持几种数据源.Spellcheck构造函数需要传入Dictionary接口: pac ...

  8. lucene字典实现原理

    http://www.cnblogs.com/LBSer/p/4119841.html 1 lucene字典 使用lucene进行查询不可避免都会使用到其提供的字典功能,即根据给定的term找到该te ...

  9. lucene字典实现原理——FST

    转自:http://www.cnblogs.com/LBSer/p/4119841.html 1 lucene字典 使用lucene进行查询不可避免都会使用到其提供的字典功能,即根据给定的term找到 ...

随机推荐

  1. Entity Framework Lambda 实现多列Group by,并汇总求和

    var result = DataSummaryRepository.FindBy(x => x.UserID == argMemberNo && x.SummaryDate & ...

  2. vps选择

    banwagonhost.com digitalocean.com vultr.com 优惠链接 https://www.vultr.com/freetrial

  3. leetcode 121

    121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of ...

  4. 《深入剖析Tomcat》读书笔记(一)

    一.Tomcat Tomcat,全名Apache Tomcat,最初是由Sun发起,后来捐赠给ASF,是Apache Jakarta下的一个子项目.Tomcat是对Servlet API定义的容器的一 ...

  5. POJ C程序设计进阶 编程题#4:寻找平面上的极大点

    编程题#4:寻找平面上的极大点 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描 ...

  6. 多次绑定DataGridView的DataSource会报错 NullReferenceExcepti

    最近做了一个winform的项目,数据绑定在datagridview中,datagridview中的数据需要删除,分页,更新等之类的操作,所以就涉及到了datagridview的重新绑定问题,而且这些 ...

  7. Windows下安装Elasticsearch

    1.下载elasticsearch-1.6.0 .jdk-7u67-windows-x64.exe 1.6.0必须用jdk1.7才能运行 2.配置JAVA_HOME:C:\Program Files\ ...

  8. mysql基本数据类型(mysql学习笔记三)

    Mysql数据类型 小数: 浮点:小数位可以变化 Float单精度默认精度6位左右 Double 双精度默认精度16位左右 支持,控制数值范围 Type(M,D) M表示所有数值位数(不包括小数点和符 ...

  9. php 安装xdebug扩展

    php 扩展获取地址 http://pecl.php.net/package/ 编译安装的过程 wget http://pecl.php.net/get/xdebug-2.2.2.tgz tar -z ...

  10. highcharts与highstock实例

    highcharts实例代码 <head> <title>highcharts报表示例</title> <meta http-equiv="Cont ...