关于搜索部分

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. 洛谷P1113 杂物

    P1113 杂务 251通过 441提交 题目提供者该用户不存在 标签图论递推 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 为什么会只有10分? 题目描述 John的农场在给奶牛挤奶前有很 ...

  2. linux程序调试常用命令

    1 调用跟踪 跟踪系统调用 strace ls –l 跟踪库调用  ltrace 2 lsof(list open file) 查看程序命令打开了哪些文件  lsof –p PID; lsof –c ...

  3. asp.net ashx 一般处理程序 使用async await异步直接 copy可用哦

    以前一直很懒  碰到ashx要用await异步就绕开  用aspx  或者mvc异步控制器  这次公司需要  我查了国内的文章基本都不能简单copy来处理一堆错关键的过程中函数BeginProcess ...

  4. 【MySQL】MySQL事务回滚脚本

    MySQL自己的 mysqlbinlog | mysql 回滚不好用,自己写个简单脚本试试: 想法是用mysqlbinlog把需要回滚的事务区域从mysql-bin.file中找到,然后通过脚本再插入 ...

  5. Eclipse 安装Groovy插件

    摘自: http://blog.csdn.net/boonya/article/details/45399901 步骤一: 下载eclipse4.3.0,地址:http://www.eclipse.o ...

  6. 将base64格式的字符串生成文件

    using System; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(stri ...

  7. 关于javascript 里面类型的判断

    javacript至今共有7中类型 Six data types that are primitives: Boolean Null Undefined Number String Symbol (n ...

  8. 文本处理命令--cut、sort、join

    声明:下面介绍的只是命令的常用选项,如果需要详细了解命令全部细节,需要参考其他的资料. 一.cut cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进 ...

  9. decode行转列,case when,

    1.行转列 转之前:

  10. 自制tab页

    没事自己弄着玩,写了个tab页.不要当真.想看就看看.希望相互学习. 效果预览:html源码: <!DOCTYPE html> <html lang="en"&g ...