<转>LUCENE3.0 自学吧 4 TermDocs

利用TermDocs也是可以得到一些有用的结果。。。代码如下

 

[java]  view plain copy
  1. package com.fpi.lucene.studying.myfirstlucene;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import org.apache.lucene.LucenePackage;  
  5. import org.apache.lucene.analysis.Analyzer;  
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.index.CorruptIndexException;  
  9. import org.apache.lucene.index.IndexFileNameFilter;  
  10. import org.apache.lucene.index.IndexReader;  
  11. import org.apache.lucene.index.Term;  
  12. import org.apache.lucene.index.TermDocs;  
  13. import org.apache.lucene.queryParser.ParseException;  
  14. import org.apache.lucene.queryParser.QueryParser;  
  15. import org.apache.lucene.search.IndexSearcher;  
  16. import org.apache.lucene.search.Query;  
  17. import org.apache.lucene.search.ScoreDoc;  
  18. import org.apache.lucene.search.TopScoreDocCollector;  
  19. import org.apache.lucene.store.FSDirectory;  
  20. import org.apache.lucene.util.Version;  
  21. public class Searcher {  
  22.     // 关键字,要搜查的对象  
  23.     public static String key_word = "about";  
  24.       
  25.     public static String field = "contents";  
  26.     public static void search() throws CorruptIndexException, IOException, ParseException{  
  27.         //打开索引所在地  
  28.         IndexSearcher sr = new IndexSearcher(FSDirectory.open(new File("d://test//myindex")),true);   
  29.           
  30.         //词法分析器  
  31.         Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);  
  32.           
  33.         //解析器  
  34.         QueryParser parser = new QueryParser(Version.LUCENE_30,field,analyzer);  
  35.           
  36.         //根据关键字查询  
  37.         Query query = parser.parse(key_word);  
  38.           
  39.         TopScoreDocCollector collector = TopScoreDocCollector.create(100false);  
  40.           
  41.         //将所搜寻出来的结果以特定的形式放在collector中  
  42.         sr.search(query, collector);  
  43.           
  44.         /** 
  45.          * topDocs():Returns the top docs that were collected by this collector.     
  46.          *            返回的是由这个collector收集的顶级文档。 
  47.          * .scoreDocs():The top hits for the query.  
  48.          *              用于查询的最高命中。 
  49.          */  
  50.         ScoreDoc[] hits = collector.topDocs().scoreDocs;  
  51.         System.out.println("搜索到符合标准的文档数目:"+hits.length);  
  52.           
  53.         //检索,根据关键字在contents这个field里边找,本节关注点。  
  54.         TermDocs temDocs = sr.getIndexReader().termDocs(new Term("contents",key_word));  
  55.         while(temDocs.next()){  
  56.             System.out.println("在文件"+sr.getIndexReader().document(temDocs.doc())+"中," +  
  57.                     "关键字出现了"+temDocs.freq()+"次。");  
  58.         }  
  59.           
  60.         System.out.println("-----------------我是无敌的分割线----------------");  
  61.           
  62.         for (int i = 0; i < hits.length; i++) {  
  63.            
  64.             Document doc = sr.doc(hits[i].doc);      //依此遍历符合标准的文档  
  65.             System.out.println(doc.getField("filename")+" ----  "+hits[i].toString()+" ---- ");  
  66.         }  
  67.         System.out.println("you have " + collector.getTotalHits() +  
  68.                   " file matched query '" + key_word + "':");  
  69.         System.out.println("Lucene's position is in:"+LucenePackage.get());  
  70.     }  
  71.       
  72.       
  73.     public static void main(String[] args) {  
  74.         try {  
  75.             search();  
  76.         } catch (CorruptIndexException e) {  
  77.             // TODO Auto-generated catch block  
  78.             e.printStackTrace();  
  79.         } catch (IOException e) {  
  80.             // TODO Auto-generated catch block  
  81.             e.printStackTrace();  
  82.         } catch (ParseException e) {  
  83.             // TODO Auto-generated catch block  
  84.             e.printStackTrace();  
  85.         }  
  86.     }  
  87. }  

 

要说明的是,如果将检索到的结果放在TopScoreDocCollector中 那么他里边的顺序是按照相关度得分从大到小排序的,也即是说最大的排最前。而利用TermDocs:

 

[java]  view plain copy
  1. TermDocs temDocs = sr.getIndexReader().termDocs(new Term("contents",key_word));  
  2. while(temDocs.next()){  
  3.     System.out.println("在文件"+sr.getIndexReader().document(temDocs.doc())+"中," +  
  4.             "关键字出现了"+temDocs.freq()+"次。");  
  5. }  

他这个“容器”里边的数据是无序的。

 

还有说明Term的初始化,有2个,一般常用的是new Term(field名称,关键字);

如果将        TermDocs temDocs = sr.getIndexReader().termDocs(new Term("contents",key_word));
错误的写成   TermDocs temDocs = sr.getIndexReader().termDocs();       

 

也就是无参初始化,则得到的结果就是每个文件他的freq都会取到值是1.

 

原链:http://blog.csdn.net/sustbeckham/article/details/5809181

猜你喜欢

转载自yingbin920.iteye.com/blog/1554866
今日推荐