Lucene_demo06_几种搜索

创建searcher的过程  
1、创建Directory 
2、根据directory创建indexReader 
3、根据indexReader创建indexSearcher 
4、创建搜索的Query 
5、根据searcher搜索并且返回TopDocs 
6、根据TopDocs获取ScordDoc对象获取具体的Document对象 
7、根据searcher和ScordDoc对象获取具体的Document对象 
8、根据Document对象获取需要的值 
9、关闭reader 

Java代码    收藏代码
  1. /** 
  2.  * @see 1、关键词查询 
  3.  * @see 2、查询所有的文档 重点 
  4.  * @see 3、范围查询 
  5.  * @see 4、通配符查询 重点 
  6.  * @see 5、短语查询 
  7.  * @see 6、Boolean查询 重点 
  8.  */  
  9. public class QueryTest {  
  10.     /** 
  11.      * 关键词查询 * 因为在创建Term对象的时候,没有分词器,所以这里的字母是区分大小写的 * Term构造函数的第二个参数指的是关键词,必须存在 
  12.      */  
  13.     @Test  
  14.     public void testTermQuery() throws Exception {  
  15.         Term term = new Term("title""总冠军");  
  16.         Query query = new TermQuery(term);  
  17.         this.testSearchIndex(query);  
  18.     }  
  19.   
  20.     /** 
  21.      * 查询所有的文档 
  22.      */  
  23.     @Test  
  24.     public void testAllQuery() throws Exception {  
  25.         Query query = new MatchAllDocsQuery();  
  26.         this.testSearchIndex(query);  
  27.     }  
  28.   
  29.     /** 
  30.      * 通配符查询 说明: * 代表任意多个任意字符 ? 代表一个任意字符 
  31.      */  
  32.     @Test  
  33.     public void testWildCardQuery() throws Exception {  
  34.         Term term = new Term("title""*总?军");  
  35.         Query query = new WildcardQuery(term);  
  36.         this.testSearchIndex(query);  
  37.     }  
  38.   
  39.     /** 
  40.      * boolean查询 可以根据Occur的常量把好几个查询结合在一起 
  41.      */  
  42.     @Test  
  43.     public void testBooleanQuery() throws Exception {  
  44.         Term term = new Term("title""总冠军");  
  45.         TermQuery termQuery = new TermQuery(term);  
  46.   
  47.         Term term2 = new Term("content""2?13");  
  48.         Query wildCardQuery = new WildcardQuery(term2);  
  49.         BooleanQuery query = new BooleanQuery();  
  50.         query.add(termQuery, Occur.SHOULD);// Occur.MUST必须有、Occur.MUST_NOT必须没有、Occur.SHOULD可以有  
  51.         query.add(wildCardQuery, Occur.SHOULD);  
  52.         this.testSearchIndex(query);  
  53.     }  
  54.   
  55.     /** 
  56.      * 范围查询 查询id范围在5~15间的数据 
  57.      */  
  58.     @Test  
  59.     public void testRangeQuery() throws Exception {  
  60.         Query query = NumericRangeQuery.newLongRange("id", 5L, 15L, truetrue);  
  61.         this.testSearchIndex(query);  
  62.     }  
  63.   
  64.     /** 
  65.      * 所有的Term对象只能在同一个field中进行 如果两个以上大的关键词进行组合查询,得知道其中的位置(分词后的位置) 
  66.      */  
  67.     @Test  
  68.     public void testPharseQuery() throws Exception {  
  69.         Term term = new Term("title""NBA总冠军");  
  70.         Term term2 = new Term("title""NBA总冠军");  
  71.         PhraseQuery phraseQuery = new PhraseQuery();  
  72.         phraseQuery.add(term);  
  73.         phraseQuery.add(term2);  
  74.         this.testSearchIndex(phraseQuery);  
  75.     }  
  76.   
  77.     // 公共输出方法  
  78.     private void testSearchIndex(Query query) throws Exception {  
  79.         IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.directory);  
  80.         TopDocs topDocs = indexSearcher.search(query, 50);  
  81.         int count = topDocs.totalHits;// 总的记录数  
  82.         ScoreDoc[] scoreDocs = topDocs.scoreDocs;  
  83.         List<Article> articleList = new ArrayList<Article>();  
  84.         for (int i = 0; i < scoreDocs.length; i++) {  
  85.             int index = scoreDocs[i].doc;  
  86.             Document document = indexSearcher.doc(index);  
  87.             Article article = DocumentUtils.document2Article(document);  
  88.             articleList.add(article);  
  89.         }  
  90.   
  91.         // 输入搜索出来的内容  
  92.         for (Article article : articleList) {  
  93.             System.out.println(article.getId());  
  94.             System.out.println(article.getTitle());  
  95.             System.out.println(article.getContent());  
  96.         }  
  97.     }  
  98.   
  99. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值