播客 > 搜索技术  >  Lucene.NET常用用法 (二)  | 登录  | RSS订阅地址  | Code平台

Lucene.NET常用用法 (二)

  我在上一篇关于LUCENE.NET的一些使用也说了一些,这里我再补充一些:( Lucene.net 查询  Lucene.net 读取全部索引      Lucene.net 分页     Lucene.net AND查询    Lucene.NET的合并索引)
  1:读取全部索引文件:
  
    for(int iLoop=reader.MaxDoc()-1;iLoop>-1;iLoop--){
        if(!reader.IsDeleted(iLoop)){//判断是否为删除
            //...
        }
    }
    reader.Close();

  2:读取指定页数的记录(分页)
  
public DataTable GetListReader(int pageI,int pPageListSize,out int pagecountI){
    if(!IndexReader.IndexExists(directory))MakeInit(directory);
    IndexReader reader = IndexReader.Open(directory);    
    pagecountI=reader.NumDocs();
    DataTable DT=this.GetSegmentTable();
    pageI=Math.Max(1,pageI);
    int startLoopI=Math.Min(reader.NumDocs(),(pageI-1)*pPageListSize);
    int stopLoopI=Math.Min(reader.NumDocs(),pageI*pPageListSize);
    int trueID = -1;
    for(int iLoop=reader.MaxDoc()-1;iLoop>-1;iLoop--){
        if(!reader.IsDeleted(iLoop)){
            ++trueID;
            //System.Web.HttpContext.Current.Response.Write(trueID);
            if(trueID>stopLoopI )break;
            if(trueID>=startLoopI && trueID<stopLoopI){
                DataRow dr=DT.NewRow();
                dr[1]=Model.TUtility.CInt(reader.Document(iLoop).Get("ID"));
                dr[2]=Model.TUtility.CInt(reader.Document(iLoop).Get("UserID"));
                dr[3]=reader.Document(iLoop).Get("UserName");
                dr[4]=Model.TUtility.CInt(reader.Document(iLoop).Get("CatID"));
                dr[5]=reader.Document(iLoop).Get("Title");
                dr[6]=DateField.StringToDate(reader.Document(iLoop).Get("Time"));
                DT.Rows.Add(dr);
            }
        }
    }
    reader.Close();
    //IndexReader.Unlock(directory);


    return DT;
}


  3:Lucene.NET的AND 查询和OR查询
  和这篇lucene.NET查询关键字默认设置为AND说的是一回事情,其默认是OR操作,可以修改为AND操作:
parser.SetDefaultOperator(Lucene.Net.QueryParsers.QueryParser.Operator.AND);
其效果就和“在搜索结果中查询”类似。

  4:Lucene.NET的多个索引文件查询:
  
    MultiReader reader = new MultiReader(new IndexReader[] { 
        IndexReader.Open(System.IO.Path.Combine(Tpl.CommonSet.Get("ThreadsIndexsData"),"main")),
        IndexReader.Open(System.IO.Path.Combine(Tpl.CommonSet.Get("ThreadsIndexsData"),"1")) }
        );
    IndexSearcher searcher = new IndexSearcher(reader);


  5:Lucene.NET的合并索引:
  由于其更新大文件索引的速度比较慢的,索引经常创建一些小文件索引,过一段时间需要合并:
  
public void MergeIndex(string from,string to){ 
    IndexWriter indexWriter = null; 
    try{ 
        //Console.WriteLine("正在合并索引文件"); 
        indexWriter = new IndexWriter(to,analyzer, false); 
        //indexWriter.SetMaxFieldLength(8000);
        indexWriter.SetMaxBufferedDocs(100);
        indexWriter.SetMergeFactor(100);
        indexWriter.SetUseCompoundFile(true);

        Directory fs = FSDirectory.GetDirectory(from,false); //RAMDirectory,FSDirectory
        indexWriter.AddIndexes(new Directory[]{fs}); 
        indexWriter.Optimize(); 
        indexWriter.Close(); 
        
    }catch(Exception e){ 
        throw new Exception("合并索引文件出错!mergeIndex()"+e.ToString()); 
    }finally{ 
        try{ 
            if(indexWriter!=null) indexWriter.Close(); 
        }catch{ 
        } 
        System.IO.Directory.Delete(from,true);
        System.IO.Directory.CreateDirectory(from);
    } 
}


  本话先到这里,有空再写其他的。
天气:大雨,ccdot发表于2008-7-8 11:01:30,阅读了735次,共有个0回复.

暂无评论

  1. 想要转载我文章的人滚远远的,能想多远,就滚多远。
  2. 不要提交任何带有网址URL信息的评论.
  3. 需要更多信息?请使用站内搜索,郁闷了?听听我在听什么吧!
用户名:*验证:看不清楚请点击刷新验证码*
内容: