Lucene.Net 创建索引和检索

None.gifLucene.Net 创建全文搜索最核心的内容是Create Index 和 Search ,而创建索引是后面搜索的基础,因为后面的搜索是使用索引来搜索的。对于创建索引,Lucene.Net 专门提供了个类实现,其中 Lucene.Net.Index..IndexWrite 创建索引并将索引写入文件,对应的Lucene.Net.Index..IndexReader 实现从文件夹中将索引读出来,以便对索引进行修改等操作
None.gif
None.gif创建索引:
None.gif
None.gifIndexWriter indexwriter 
=   new  IndexWriter( " index " new  StandardAnalyzer(),  true ); 
None.gif
None.gif首先是定义一个索引写入器indexwrite,其中第一个参数index表示要存储索引的文件夹,第二个参数是一个分析对象,主要用于从文本中抽取那些需要建立索引的内容,把不需要参与建索引的文本内容去掉.比如去掉一些a the之类的常用词,还有决定是否大小写敏感.不同的选项通过指定不同的分析对象控制,第三个参数用于确定是否覆盖原有索引,true表示新创建的索引将覆盖掉原来的索引,
false  将重新创建并保留原有索引。
None.gif
None.gifDocument doc 
=   new  Document();
None.gif
None.gif创建一个文档对象
None.gif
None.gifdoc.Add(Field.UnStored(
" text " , context);
None.gif
None.gifdoc.Add(Field.Keyword(
" path " , path));         
None.gif
None.gifdoc.Add(Field .Text (
" filename " ,filename));
None.gif
None.gif给文档添加属性,Add方法是将一个属性添加到doc中,text是要添家的属性的名字,context是要创建索引的内容,可以是任何可以解读的数据源,这里要注意的是Field中的几个类型,总共有4个
None.gif
1 、Keyword 见名知意就是关键字,该字段中的内容不经过分析但会被索引并直接保存到索引中,比如:good,filename,teacher等字符串常量,也可以是一个字符串数组,如string [] contex = {“doc”,”xls”,”ppt”,”pdf”,html”,txt”}  
None.gif
None.gifForeach(stirng strcontex 
in  contex)
None.gif
{

     doc.Add(Filed.Keyword(“text”,strcontex);

}

None.gif
None.gif也可以这样将你的关键字添家到文档中。
None.gif
None.gif
2 、 UnIndexed 不被分析,不被索引,但却保存在索引中
None.gif
None.gif
3 、Unstrored 和UnIndexed刚好相反
None.gif
None.gif
4 、 Text 和UnStrored类似.如果值的类型为string还会被保存.如果值的类型为Reader就不会被保存和UnStored一样.
None.gif
None.gifindexriter.AddDocument(doc);  
None.gif
None.gif将doc添加到索引中   None.gifwriter.Optimize(); 
None.gif
None.gif对创建的索引进行优化
None.gifwriter.Close();
None.gif
None.gif关闭写入器
None.gif
None.gif到此一个简单的索引创建完毕。
None.gif
None.gif下面再提供一个创建索引的例子:
None.gif
private  String[] keywords  =   {"20001895""20001896"} ;
None.gif
private  String[] unindexed  =   {"Red star""good morning"} ;
None.gif
private  String[] unstored  =   "I am a programer",  "you are programmer ,too",} ;
None.gif
private  String[] text1  =   " programer ""morning"     } ;
None.gif
private  String[] text2  =   "200606""200609"   }
None.gif
private  String[] text3  =   "/Computers/red""/Computers/star" } ;
None.gif
None.gif
private  Directory dir; 
None.gif
None.gif
protected   void  AddDocuments()
None.gif
{   

    
string indexDir = "index";

    dir 
= FSDirectory.GetDirectory(indexDir, true);

    IndexWriter writer
=new IndexWriter(dir, GetAnalyzer(), true); 

    
for (int i = 0; i < keywords.Length; i++)

    
{

       Document doc 
= new Document();

       doc.Add(Field.Keyword(
"isbn", keywords[i]));

       doc.Add(Field.UnIndexed(
"title", unindexed[i]));

       doc.Add(Field.UnStored(
"contents", unstored[i]));

       doc.Add(Field.Text(
"subject", text1[i]));

       doc.Add(Field.Text(
"pubmonth", text2[i]));

       doc.Add(Field.Text(
"category", text3[i]));

       writer.AddDocument(doc);

    }
         

    writer.Optimize();

    writer.Close();

}

None.gif
None.gif 
None.gif
None.gif数据检索:
None.gif
None.gif创建完了索引后怎么来利用索引检索数据,这里就要用到Lucene.Net.Searcher.IndexSercher个类来读取索引文件,并将读取的结果放在 Hits中,这里的Hits是一个集合,和DataSet有相似之处,DataSet中放的是Tables,Hits中放的是Documents,然后就是将Hits中的数据怎么处理的问题,这不是论述的重点,以后有时间再写这部分。
None.gif
None.gifIndexSearcher searcher 
=   new  IndexSearcher(indexDirectory);      
None.gif
None.gif创建一个搜索器,参数是创建索引的路径 
None.gif
None.gifQuery query 
=  QueryParser.Parse(condition,  " text " new  StandardAnalyzer());
None.gif
None.gif定义一个查询对象,参数condition表示查询的条件,text 我们创建索引时的要被分析的内容,第三个是个分析对象
None.gif
None.gifHits hits 
=  searcher.Search(query);
None.gif
None.gif通过搜索器将搜索的Document放到Hits中
None.gif
None.gifInt total 
=  hits.Length();  
None.gif
None.gif计算hits中有多少个Document             
None.gif
None.gif
for  ( int  i  =   0 ; i  <  total; i ++
None.gif
None.gif循环遍历
None.gif
{

    Document doc 
= hits.Doc(i);   

    
string path = doc.Get("path");                    

    
string plainText =doc.Get(“text”);;

    
string str=doc.Get ("filename");

  通过Get方法将搜索的内容提取出来

}
 
None.gif
None.gifsearcher.Close();
// 关闭搜索器
None.gif

None.gif 
None.gif 
None.gif 
None.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值