论坛首页 Java版

关于BooleanQuery的问题

浏览 605 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-11-10 关键字: Lucene
java 代码
  1. /**  
  2.  *   
  3.  */  
  4. package com.futurebnc.demo.search.test;   
  5.   
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;   
  7. import org.apache.lucene.document.Document;   
  8. import org.apache.lucene.document.Field;   
  9. import org.apache.lucene.index.IndexWriter;   
  10. import org.apache.lucene.index.Term;   
  11. import org.apache.lucene.search.BooleanClause;   
  12. import org.apache.lucene.search.BooleanQuery;   
  13. import org.apache.lucene.search.Hits;   
  14. import org.apache.lucene.search.IndexSearcher;   
  15. import org.apache.lucene.search.Query;   
  16. import org.apache.lucene.search.TermQuery;   
  17.   
  18. /**  
  19.  * @author crazy.j  
  20.  *   
  21.  */  
  22. public class TestBooleanQuery {   
  23.   public static void main(String[] args) throws Exception {   
  24.     createIndex();   
  25.        
  26.     Query query1 = null;   
  27.     Query query2 = null;   
  28.     Query query3 = null;   
  29.     Query query4 = null;   
  30.     Query query5 = null;   
  31.     BooleanQuery bquerymain = null;   
  32.     BooleanQuery bquery1 = null;   
  33.     BooleanQuery bquery2 = null;   
  34.     BooleanQuery bquery3 = null;   
  35.     Hits hits = null;   
  36.   
  37.     IndexSearcher searcher = new IndexSearcher("c:\\java\\index");   
  38.   
  39.     query1 = new TermQuery(new Term("name""word1"));   
  40.     query2 = new TermQuery(new Term("name""word2"));   
  41.        
  42.     query3 = new TermQuery(new Term("name""word4"));   
  43.     query4 = new TermQuery(new Term("name""word5"));   
  44.        
  45.     query5 = new TermQuery(new Term("name""word6"));   
  46.        
  47.        
  48.   
  49.     // 构造布尔查询   
  50.     bquerymain = new BooleanQuery();   
  51.     bquery1 = new BooleanQuery();   
  52.     bquery2 = new BooleanQuery();   
  53.     bquery3 = new BooleanQuery();   
  54.   
  55.     bquery1.add(query1, BooleanClause.Occur.MUST);   
  56.     bquery1.add(query2, BooleanClause.Occur.MUST);   
  57.        
  58.     bquery2.add(query3, BooleanClause.Occur.MUST);   
  59.     bquery2.add(query4, BooleanClause.Occur.MUST);   
  60.        
  61.     bquery3.add(query5, BooleanClause.Occur.MUST_NOT);   
  62.        
  63.     bquerymain.add(bquery1, BooleanClause.Occur.SHOULD);   
  64.     bquerymain.add(bquery2, BooleanClause.Occur.SHOULD);   
  65.     bquerymain.add(bquery3, BooleanClause.Occur.MUST);   
  66.     hits = searcher.search(bquerymain);   
  67.     printResult(hits, bquerymain.toString());   
  68.   
  69.   }   
  70.      
  71.   public static void createIndex() throws Exception {   
  72.     Document doc1 = new Document();   
  73.     Field field = null;   
  74.     field = new Field("name""word1 word2 word3", Field.Store.YES,   
  75.         Field.Index.TOKENIZED);   
  76.     doc1.add(field);   
  77.     field = new Field("title""doc1", Field.Store.YES, Field.Index.TOKENIZED);   
  78.     doc1.add(field);   
  79.   
  80.     Document doc2 = new Document();   
  81.     field = new Field("name""word4 word5", Field.Store.YES,   
  82.         Field.Index.TOKENIZED);   
  83.     doc2.add(field);   
  84.     field = new Field("title""doc2", Field.Store.YES, Field.Index.TOKENIZED);   
  85.     doc2.add(field);   
  86.   
  87.     Document doc3 = new Document();   
  88.     field = new Field("name""word1 word2 word6", Field.Store.YES,   
  89.         Field.Index.TOKENIZED);   
  90.     doc3.add(field);   
  91.     field = new Field("title""doc3", Field.Store.YES, Field.Index.TOKENIZED);   
  92.     doc3.add(field);   
  93.   
  94.     IndexWriter writer = new IndexWriter("c:\\java\\index",   
  95.         new StandardAnalyzer(), true);   
  96.     writer.addDocument(doc1);   
  97.     writer.addDocument(doc2);   
  98.     writer.addDocument(doc3);   
  99.     writer.close();   
  100.   }   
  101.   
  102.   public static void printResult(Hits hits, String key) throws Exception {   
  103.     System.out.println("查询 " + key);   
  104.     if (hits != null) {   
  105.       if (hits.length() == 0) {   
  106.         System.out.println("没有找到任何结果");   
  107.       } else {   
  108.         System.out.println("找到" + hits.length() + "个结果");   
  109.         for (int i = 0; i < hits.length(); i++) {   
  110.           Document d = hits.doc(i);   
  111.           String dname = d.get("title");   
  112.           System.out.print(dname + "   ");   
  113.         }   
  114.         System.out.println();   
  115.         System.out.println();   
  116.       }   
  117.     }   
  118.   }   
  119.   
  120. }   

这段代码为何查询不到任何结果?

但是如果将65行代码改为

java 代码
  1. bquerymain.add(query5, BooleanClause.Occur.MUST_NOT);  

就可以查询到结果

 

   
最后更新时间:2007-11-11
你的Lucene逻辑表达式是什么呢?
printf出来瞧瞧就知道了问题在哪里了
看得不是很明白。
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐