lucene创建索引,查询索引

在NuGet安装PanGu和Lucene.Net

 

 

创建索引

IndexWriter writer = new IndexWriter(IndexDic, PanGuAnalyzer, isCreate, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);

IndexDic是索引存放目录

PanGuAnalyzer是盘古解析器(由于默认的解析器解析能力不强,所以替换为这个)

IsCreate是索引创建方式(true:重新新建索引,false:从旧的索引执行追加)

Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED是文件长度是否限制

static void Main(string[] args)
        {

        //Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_CURRENT);
        Analyzer analyzer = new Lucene.Net.Analysis.PanGu.PanGuAnalyzer();//PanGuAnalyzer是盘古解析器(由于默认的解析器解析能力不强)


            Lucene.Net.Store.Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo("Dic"));
            //创建索引

            IndexWriter writer = new IndexWriter(directory, analyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
            AddDocument(writer, "精通Visual C#2005——语言基础、数据库系统开发、Web开发(附光盘)", @"本书体系完整,结合应用介绍了Visual Studio.NET平台下的C#编程技术,全书分为4个部分:C#编程基础、.NET类库剖析、开发网络程序和综合案例,共23章,并附有大量代码实例。第一部分介绍了使用C#语言进行面向对象系统开发的基本知识;第二部分详细介绍了.NET类库中的部分常用空间,熟练掌握这些基本对象是利用C#开发程序的基础;第三部分具体介绍了利用C#开发ASP.NET Web系统的技术;最后一部分给出了4个结构完整的案例。
  全书紧密结合开发实例展开,是一本教科书和参考书的结合体。初级读者可以系统学习本书,整体掌握使用C#语言进行应用程序开发的技术;中级读者可跳过或浏览熟悉的内容;对高级读者而言,本书可以作为一本开发手册使用。", "20061101");
            AddDocument(writer, "SQL Server 2008 的发布", "SQL Server 2008 的新特性", "20060101");
            AddDocument(writer, "ASP.Net MVC框架配置与分析", "而今,微软推出了新的MVC开发框架,也就是Microsoft ASP.NET 3.5 Extensions", "20060111");
            AddDocument(writer, "中日关系", "中方和日方一衣带水", "20060130");
            AddDocument(writer, "中日关系", "中国某高层领导说日本欠扁", "20060401");
            AddDocument(writer, "中日合作", "中日合作多个项目", "20060131");
            writer.Optimize();
            writer.Close();
}

Field构造函数说明:

第一个是字段名称(实例里是Title,Content,AddTime)。

第二个是字段的存储方式(Field.Store.YES:进行存储,Filed.Store.No:不进行存储)有些字段值比较大,可以选择No不存储,对字段进行存储是为了检索的时候对某些字段进行提取。

第三个是是否索引(Field.Index.ANALYZED:索引, Field.Index.NOT_ANALYZED:非索引)

static void AddDocument(IndexWriter writer, string title, string content,string time)
        {
            Document document = new Document();
            document.Add(new Field("title",title,Field.Store.YES,Field.Index.ANALYZED));//存储且索引
            document.Add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED));
            document.Add(new Field("time",time,Field.Store.YES,Field.Index.ANALYZED));
            writer.AddDocument(document);
        }

生成索引

 

 

查询索引

lucene的搜索相当强大,它提供了很多辅助查询类,每个类都继承自Query类,各自完成一种特殊的查询,你可以像搭积木一样将它们任意组合使用,完成一些复杂操 作;另外lucene还提供了Sort类对结果进行排序,提供了Filter类对查询条件进行限制

static void Main(string[] args)
        {
            Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_CURRENT);
            Lucene.Net.Store.Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo("Dic"));
            IndexSearcher searcher = new IndexSearcher(directory, true);//索引查询器,它的构造函数有两个参数,一个是索引文件路径,一个是是否只读(一般都设置为true就可以)。这个东西可以理解为SqlServer里面的查询分析器
            MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_CURRENT, new string[] { "title", "content" }, analyzer);
            QueryParser titleQueryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_CURRENT, "title", analyzer);
            Query titleQuery = titleQueryParser.Parse("");
            TermQuery contentQuery = new TermQuery(new Term("cotent", "M"));//最基本查询
            PhraseQuery pTitleQuery = new PhraseQuery();//文字中间间隔查询
            pTitleQuery.Slop = 5;//文字中间间隔
            pTitleQuery.Add(new Term("content", ""));
            pTitleQuery.Add(new Term("content", ""));
            PrefixQuery prefixQuery = new PrefixQuery(new Term("content", ""));//以某字开头的

            Query fuzzyQuery = new FuzzyQuery(new Term("content", "NET"));//用来搜索相似的term

            TermRangeQuery rangeQuery = new TermRangeQuery("time", "20060101", "20060130", true, true);//搜索时间域

            BooleanQuery bq = new BooleanQuery();
            //SHOULD:或,MUST:与,MUST_NOT:非
            bq.Add(titleQuery, Occur.SHOULD);
            bq.Add(contentQuery, Occur.SHOULD);
            bq.Add(pTitleQuery, Occur.SHOULD);
            bq.Add(prefixQuery, Occur.SHOULD);
            bq.Add(fuzzyQuery, Occur.SHOULD);
            bq.Add(rangeQuery, Occur.MUST);

            Stopwatch stopwatch = Stopwatch.StartNew();
            Sort sort = new Sort();//索引排序类
            sort.SetSort(new SortField("time", SortField.STRING, true));//构造函数第三个字段true为降序,false为升序
            //TopScoreDocCollector collector = TopScoreDocCollector.Create(10 * 1000, true);
            //searcher.Search(bq,null, collector);

            TopDocs topDoc = searcher.Search(bq, (Filter)null, 10 * 1000, sort);//查询后返回的文档,可以理解为Sqlserver的表

            //TopDocs topDoc = collector.TopDocs(0, collector.TotalHits);
            //for (var i = 0; i < collector.TotalHits; i++)
            for (var i = 0; i < topDoc.TotalHits; i++)
            {
                Lucene.Net.Documents.Document docs = searcher.Doc(topDoc.ScoreDocs[i].Doc);
                string title = docs.Get("title");
                string content = docs.Get("content");
                Console.WriteLine(title + "\n" + content);
            }
            stopwatch.Stop();
            Console.Read(); 
        }

 

 

Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于Lucene.net实现全文检索的功能。

Lucene.net并不是一个爬行搜索引擎,也不会自动地索引内容。我们得先将要索引的文档中的文本抽取出来,然后再将其加到Lucene.net索引中。标准的步骤是先初始化一个Analyzer、打开一个IndexWriter、然后再将文档一个接一个地加进去。一旦完成这些步骤,索引就可以在关闭前得到优化,同时所做的改变也会生效。这个过程可能比开发者习惯的方式更加手工化一些,但却在数据的索引上给予你更多的灵活性。

(来自百度百科)

posted @ 2016-11-02 13:35  wjl910  阅读(328)  评论(0)    收藏  举报