Lucene.Net多字段查询,多索引查询

本文转载自:http://www.cnblogs.com/jianjunyue/archive/2011/09/19/2181102.htmls

问:Lucene.net的搜索结果的百分比相关度值是如何实现的?
答:
    Hits result = searcher.Search(q);
    float score = result.Score(n) ;//n为查询结果文挡序号,返回的是一个<=1f的float的值,表示为百分比字符串:score.ToString("0%") ;

问:如何通过编程的方式改变Lucene.net的锁文件存放的位置?
答: 
    Lucene.net的锁文件默认是存放系统临时文件夹,可以通过下面的语句来修改
    System.Configuration.ConfigurationSettings.AppSettings.Add("Lucene.Net.lockDir", "your new lockDir") ;
    通过FSDirectory.LOCK_DIR可以获得锁文件存放的位置(文件夹)
    
问:如何判断某个索引库被锁定,如何强制解除锁定?
答:
   具体实现,可以参看Lucene.Net.Store.FSDirectory的Obtain()(判断是否锁定)方法和Release()方法(解除锁定)   
   备注:还有一个IsLocked方法也可以参考下。
   
问:如何实现多个索引的联合搜索 ?
答:
   IndexSearcher[] searchers = new IndexSearcher[2];
   searchers[0] = new IndexSearcher(dir1) ;
   searchers[1] = new IndexSearcher(dir2) ;
   
   MultiSearcher searcher = new MultiSearcher(searchers) ;//或ParallelMultiSearcher searcher = new ParallelMultiSearcher(searchers) ;
   searcher.Search(query) ;
   
   ParallelMultiSearcher与MultiSearcher的区别,前者为每一个索引单独开一个线程,以多线程的方式同步搜索;后者是逐个依次搜索,然后合并;
   所以ParallelMultiSearcher的搜索总用时是最慢的哪个索引的搜索用时,MultiSearcher则是搜索总用时等于所有索引搜索用时之和;
   
问:如何实现在结果中搜索 ?
答:
    *方法一,使用CachingWrapperFilter。不能实现无限级的“在结果中搜索”:
    QueryParser parser = new QueryParser("content", analyzer);
    
    Query currentQuery = parser.Parse(currentKeyword) ;
 Query oldQuery = parser.Parse(oldKeyword) ;

 QueryFilter oldFilter = new QueryFilter(oldQuery) ;
 CachingWrapperFilter filter = new CachingWrapperFilter(oldFilter) ;
 
 IndexSearcher searcher = new IndexSearcher(indexDir);
 
 Hits result = searcher.Search(currentQuery, filter) ; 
 
 *方法二,将多个查询关键词做AND的BooleanQuery或者直接构造查询Sytax传给QueryParser,都可以实现无限级的“在结果中搜索“。
 
问:BooleanQuery.maxClauseCount的含义 ?
答:
    添加到BooleanQuery的最多的Query数,默认是1024。超过该值会抛出TooManyClauses异常,可以通过BooleanQuery.SetMaxClauseCount(int)设置新的值。

    备注:含义解释未明确。

问:如何判断一个索引库是否存在?
答:
   string indexPath = "your indexPath" ; //索引所在目录
   if (System.IO.Directory.Exists(indexPath) && System.IO.File.Exists(Path.Combine(indexPath,"segments") 
      //存在
   else
      //不存在
   
   当然有更直接的方法
   if (Lucene.Net.Index.IndexReader.IndexExists(indexPath))
     //存在
   else
     //不存在
     
   Lucene.Net.Index.IndexReader.IndexExists方法内部的实现方式和上面的类似,当然直接用Lucene.Net.Index.IndexReader.IndexExists更可靠些。

 

本文转载自:http://hi.baidu.com/lewutian/blog/item/2ade16d6b25bf12307088be3.html

 

Lucene.net是目前在.net环境中被普遍使用的全文索引的开源项目,这次在项目的开发中也使用它进行全文索引。
在开发过程中碰到一些小问题就是对多字段和多索引目录进行搜索。
1、多字段搜索就是同时要一个以上的字段中的内容进行比较搜索,类似概念在SQL中就是select * from Table where a like '%query%' or b like '%query%'。

Lucene.net中的单个字段查询大家都比较熟悉,这里对字段content进行搜索
Query query = QueryParser.Parse(querystr,"content",new ChineseAnalyzer());
Hits hits = searcher.Search(query);

对多个字段查询用到一个MultiFieldQueryParser对象,该对象继承自Query,我们要对字段title,content进行搜索。
string[] fields = {"content","title"};
Query multiquery = MultiFieldQueryParser.Parse(querystr,fields,new ChineseAnalyzer());
Hits hits = searcher.Search(multiquery);

2、多索引目录就是要在多个索引目录的中进行比较搜索,类似概念在SQL中就是select * from TableA union select * from TableB。
IndexSearcher[] searchers = new IndexSearcher[2];
searchers[0] = new IndexSearcher(IndexPath0);
searchers[1] = new IndexSearcher(IndexPath1);

MultiSearcher multisearcher = new MultiSearcher(searchers);
TopDocs multitopdocs = multisearcher.Search(query, null, 1000);
这个搜索的结果可能有相同的信息,比如你有一条相同的信息在多个目录中索引,搜索的结果就会出现多次相同的信息。

还有一种搜索方式是用到ParallelMultiSearcher这个对象,它是从MulitSearcher继承而来。
ParallelMultiSearcher parallelmultisearcher = new ParallelMultiSearcher(searchers);
TopDocs paralleltopdocs = parallelmultisearcher.Search(query, null, 1000);
这个搜索是对搜索后的结果进行合并,剔除重复的信息。

你可能感兴趣的:(Lucene)