lucence初步学习

Lucene简介

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

 

Lucene 原理
    lucene的检索算法属于索引检索,即用空间来换取时间,对需要检索的文件、字符流进行全文索引,在检索的时候对索引进行快速的检索,得到检索位置,这个位置记录检索词出现的文件路径或者某个关键词。
    在使用数据库的项目中,不使用数据库进行检索的原因主要是:数据库在非精确查询的时候使用查询语言“like %keyword%”,对数据库进行查询是对所有记录遍历,并对字段进行“%keyword%”匹配,在数据库的数据庞大以及某个字段存储的数据量庞大的时候,这种遍历是致命的,它需要对所有的记录进行匹配查询。因此,lucene主要适用于文档集的全文检索,以及海量数据库的模糊检索,特别是对数据库的 xml或者大数据的字符类型。

 

lucene.net的官方网站是:http://incubator.apache.org/lucene.net/

Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory

Document

Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。

Field

Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。

Analyzer

在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。

IndexWriter

IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。

Directory

这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。

 

demo如下:

public void UniteIndex() 
        {
            //建立写入者
            IndexWriter writerDisk = new IndexWriter(FSDirectory.GetDirectory("e:\\indexDisk", true), new ChineseAnalyzer(), true);
            Document docDisk = new Document();
            docDisk.Add(new Field("name", "水果", Field.Store.YES, Field.Index.ANALYZED));
            writerDisk.AddDocument(docDisk);

            RAMDirectory ramDir = new RAMDirectory();
            IndexWriter writerRam = new IndexWriter(ramDir, new ChineseAnalyzer(), true);
            Document docRam = new Document();
            docRam.Add(new Field("name", "苹果", Field.Store.YES, Field.Index.ANALYZED));  
            writerRam.AddDocument(docRam);  
            writerRam.Close();
            writerDisk.AddIndexes(new Lucene.Net.Store.Directory[] { ramDir });
            writerDisk.Close();  
        }  
        public void UniteSearch()
        {
            QueryParser queryParser = new QueryParser("name", new ChineseAnalyzer());
            Query query = queryParser.Parse("苹果");
            IndexSearcher indexSearcher = new IndexSearcher("e:\\indexDisk");
            Hits hits = indexSearcher.Search(query);
            //System.out.println("找到了"+hits.length()+"结果");  
            for (int i = 0; i < hits.Length(); i++)
            {  
                Document doc = hits.Doc(i);  
                //System.out.println(doc.get("name"));  
            }  
        } 

posted on 2019-02-26 11:15  hay123  阅读(212)  评论(0)    收藏  举报

导航