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);&nbs

    p;  
          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();   
           }   
         }   
       }   
    }   
  • 相关阅读:
    ubuntu 防止软件包自动更新
    记录一个开头带有&#x的特征数据的解码
    从一次失败的微信小程序抓包、反编译经历中学习反思
    Python爬虫处理奇葩的请求参数payload
    python爬虫
    python爬虫处理在线预览的pdf文档
    python高级—— 从趟过的坑中聊聊爬虫、反爬、反反爬,附送一套高级爬虫试题
    djangorestframework+vue-cli+axios,为axios添加token作为headers踩坑记
    django 问题综合
    vue(9)—— 组件化开发
  • 原文地址:https://www.cnblogs.com/pony/p/1496925.html
Copyright © 2011-2022 走看看