zoukankan      html  css  js  c++  java
  • 多个TermQuery或一个MultiFieldQueryParser构建BooleanQuery多个域的检索学习实例代码

    import java.io.IOException;

    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.index.CorruptIndexException;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.queryParser.MultiFieldQueryParser;
    import org.apache.lucene.search.BooleanClause;
    import org.apache.lucene.search.BooleanQuery;
    import org.apache.lucene.search.Hits;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.TermQuery;

    /**
     * 与或非布尔查询——Lucene中的BooleanQuery
     * @author USER
     *
     */
    public class TestBooleanQuery {
       /**
        * 主函数,运行测试程序
        * @param args
        * @throws Exception
        */
     public static void main(String[] args) throws Exception {   
         //建索引
      createIndex();   
          
      //多个TermQuery构建BooleanQuery检索
          searchIndex4TermQuery();
        
         //一个MultiFieldQueryParser构建BooleanQuery多个域的检索
         searchIndex4MultiFieldQueryParser();
       }   
        
     /**
      * 建索引
      * @throws Exception
      */
       public static void createIndex() throws Exception {   
         Document doc1 = new Document();   
         Field field = null;   
         field = new Field("name", "word1 word2 word3", Field.Store.YES,   
             Field.Index.TOKENIZED);   
         doc1.add(field);   
         field = new Field("title", "doc1", Field.Store.YES, Field.Index.TOKENIZED);   
         doc1.add(field);   
       
         Document doc2 = new Document();   
         field = new Field("name", "word4 word5", Field.Store.YES,   
             Field.Index.TOKENIZED);   
         doc2.add(field);   
         field = new Field("title", "doc2", Field.Store.YES, Field.Index.TOKENIZED);   
         doc2.add(field);   
       
         Document doc3 = new Document();   
         field = new Field("name", "word1 word2 word6", Field.Store.YES,   
             Field.Index.TOKENIZED);   
         doc3.add(field);   
         field = new Field("title", "doc3", Field.Store.YES, Field.Index.TOKENIZED);   
         doc3.add(field);   
       
         /**
          * 为测试MultiFieldQueryParser而添加的文档
          */
         Document doc4 = new Document();   
         field = new Field("name", "word1 word2 word3", Field.Store.YES,   
              Field.Index.TOKENIZED);   
         doc4.add(field);   
         field = new Field("title", "doc1 word1", Field.Store.YES, Field.Index.TOKENIZED);   
         doc4.add(field);
        
         /**
          * 对MultiFieldQueryParser更深理解
          */
         Document doc5 = new Document();   
         field = new Field("title", "北京2008年奥运会", Field.Store.YES,   
              Field.Index.TOKENIZED);   
         doc5.add(field);   
         field = new Field("name", "这是一届创造奇迹、超越梦想的.......", Field.Store.YES, Field.Index.TOKENIZED);   
         doc5.add(field);
        
         Document doc6 = new Document();   
         field = new Field("title", "北京2008年奥运会", Field.Store.YES,   
              Field.Index.TOKENIZED);   
         doc6.add(field);   
         field = new Field("name", "这是一届创造奇迹、超越梦想的奥运会.......", Field.Store.YES, Field.Index.TOKENIZED);   
         doc6.add(field);
        
         IndexWriter writer = new IndexWriter("e:\\java\\index",   
             new StandardAnalyzer(), true);   
         writer.addDocument(doc1);   
         writer.addDocument(doc2);   
         writer.addDocument(doc3);
        
         writer.addDocument(doc4);
        
         writer.addDocument(doc5);
         writer.addDocument(doc6);
        
         writer.close();   
       } 
      
       /**
        * 由TermQuery和BooleanQuery构建的多个域检索
        * @throws Exception
        */
       public static void searchIndex4TermQuery() throws Exception{
        TermQuery query1 = null;   
          TermQuery query2 = null;   
          TermQuery query3 = null;   
          TermQuery query4 = null;   
          TermQuery query5 = null; 
          TermQuery query6 = null; 
          BooleanQuery bquerymain = null;   
          BooleanQuery bquery1 = null;   
          BooleanQuery bquery2 = null;   
          BooleanQuery bquery3 = null;   
          Hits hits = null;   
        
          IndexSearcher searcher = new IndexSearcher("e:\\java\\index");   
        
          query1 = new TermQuery(new Term("name", "word1"));   
          query2 = new TermQuery(new Term("name", "word2"));   
          
          query3 = new TermQuery(new Term("name", "word3"));
         
          query4 = new TermQuery(new Term("name", "word4"));   
          query5 = new TermQuery(new Term("name", "word5"));   
             
          query6 = new TermQuery(new Term("name", "word6"));   
             
             
        
          // 构造布尔查询(可根据你的要求随意组合)   
          bquerymain = new BooleanQuery();   
          bquery1 = new BooleanQuery();   
          bquery2 = new BooleanQuery();   
          bquery3 = new BooleanQuery();   
        
          bquery1.add(query1, BooleanClause.Occur.MUST);   
          bquery1.add(query3, BooleanClause.Occur.MUST);   
             
          bquery2.add(query3, BooleanClause.Occur.MUST);   
          bquery2.add(query4, BooleanClause.Occur.MUST);   
             
          bquery3.add(query5, BooleanClause.Occur.MUST);
          bquery3.add(query6, BooleanClause.Occur.MUST_NOT);
             
          bquerymain.add(bquery1, BooleanClause.Occur.SHOULD);   
          bquerymain.add(bquery2, BooleanClause.Occur.SHOULD);   
          bquerymain.add(bquery3, BooleanClause.Occur.MUST); 
         
          /**
           * 根据你的要求建一个BooleanQuery对象,然后来查询
           */
          hits = searcher.search(bquery3);   
          printResult(hits, bquery1.toString());   
        
       }
       
       /**
        * 由MultiFieldQueryParser和BooleanQuery构建的多个域检索
        * @throws Exception
        */
       public static void searchIndex4MultiFieldQueryParser() throws Exception{
          Hits hits = null;   
        
          IndexSearcher searcher = new IndexSearcher("e:\\java\\index");   
        
          // 构造布尔查询(可根据你的要求随意组合) 
          BooleanClause.Occur[] flags = new BooleanClause.Occur[] {
         BooleanClause.Occur.MUST, BooleanClause.Occur.MUST};
        
          Query query = MultiFieldQueryParser.parse("word1", new String[] {
         "name", "title"}, flags, new StandardAnalyzer());
        
        /*  //加深对MultiFieldQueryParser的理解(注意看建索引的文档doc5,doc6与检索后的结果)
          Query query = MultiFieldQueryParser.parse("北京 奥运会", new String[] {
         "name", "title"}, flags, new StandardAnalyzer());    */
       
          hits = searcher.search(query);   
          printResult(hits, query.toString());   
        
       }
      
       /**
        * 打印输出检索出的文档,并输出检索的布尔语句
        * @param hits
        * @param key
        * @throws Exception
        */
       public static void printResult(Hits hits, String key) throws Exception {   
         System.out.println("查询 " + key);   
         if (hits != null) {   
           if (hits.length() == 0) {   
             System.out.println("没有找到任何结果");   
           } else {   
             System.out.println("找到" + hits.length() + "个结果");   
             for (int i = 0; i < hits.length(); i++) {   
               Document d = hits.doc(i);   
               String dname = d.get("title");   
               System.out.print(dname + "   ");   
             }   
             System.out.println();   
             System.out.println();   
           }   
         }   
       }   
    }   


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/foamflower/archive/2008/09/24/2972575.aspx

  • 相关阅读:
    Oracle中常用的to_Char用法详解(有FMT的详细列表)
    js底层ajax
    MD5加密
    "<br />"和 "\r\n" 这两者有什么区别??
    SqlHelper类
    treeview实例
    在标题栏显示新消息提示,很多公司项目中用到这个方法
    SQL一些时间格式的转换
    用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
    SQL Server触发器创建、删除、修改、查看示例步骤
  • 原文地址:https://www.cnblogs.com/twilight/p/1553338.html
Copyright © 2011-2022 走看看