zoukankan      html  css  js  c++  java
  • lucene3.6笔记添加搜索功能

      lucene为程序添加搜索功能,此功能基于已创建好的文档的索引之上。这里我已经为一些文档建立了索引,并保存到硬盘上。下面开始针对这些索引,添加搜索功能。

    1、简单的TermQuery搜索

    Java代码
        /** 
             * 【TermQuery方式搜索】 
             *  
             * 对特定的项进行查询,如filename等于XPP3-LICENSE.txt的文件 
             * @throws Exception 
             */  
            public void testTerm() throws Exception {  
                Directory dir=FSDirectory.open(new File("d:/index/book_index/"));  
                IndexSearcher searcher=new IndexSearcher(dir);  
                  
                Term t=new Term("content","params");  
                Query query=new TermQuery(t);  
                TopDocs docs=searcher.search(query, 10);  
                System.out.println(docs.totalHits+"--------");  
          
                  
                t=new Term("filename","version");  
                docs=searcher.search(new TermQuery(t), 10);  
                System.out.println(docs.totalHits);  
                searcher.close();  
                dir.close();  
            }  
    
    
    
    

    2、使用QueryParser转化用户复杂输入,进行与或非查询操作。

    Java代码
        /** 
         * 【QueryParser查询】 
         *  
         *  
         * 模糊查询,与,或,非方式 
         * @throws Exception 
         */  
        public void testQueryParse() throws Exception{  
            Directory dir=FSDirectory.open(new File("d:/index/book_index/"));  
            IndexSearcher search=new IndexSearcher(dir);  
              
            QueryParser parser=new QueryParser(Version.LUCENE_30,"content",new SimpleAnalyzer());  
            Query query=parser.parse("+ADVISED +POSSIBILITY -JAVA");  
            TopDocs docs=search.search(query, 10);  
        /       assertEquals(1, docs.totalHits);  
            Document document=search.doc(docs.scoreDocs[0].doc);  
            System.out.println("查询第一个的名称"+document.get("filename"));  
            System.out.println("与或非查询个数"+docs.totalHits);  
              
            query=parser.parse("Indiana OR University");  
            docs=search.search(query, 10);  
            System.out.println("Or查询个数"+docs.totalHits);  
          
            search.close();  
            dir.close();  
        }  


     

    查询表达式

    匹配文档

    Java

    默认域包含有Java项的文档

    Java junit

    Java OR junit

    默认域包含有Java,junit中一个,或者两个的文档

    +Java +junit

    Java AND junit

    默认域同时包含有Java和junit的文档

    Title:ant

    Title域中包含有ant的文档

    Title:extreme -subject:sport

    Title:extreme AND NOT subject:sport

    Title域中包含extreme而且subject域中不包含sport

    (agile OR extreme) AND methody

    默认域包含有methody且包含agile或者extreme中的一个

    Title:“junit in action”

    Title域一定为junit in action的文档

    Title:“junit action“ -5

    Title域中junit和action的间隔小于5的文档

    Java*

    包含有Java开头的文档,如Javascript,Javaserver,Java等

    Java~

    包含与Java单词相近的文档,如Java

    Lastdate:[1/1/09 TO 12/31/09]

    Lastdate域在09年1月1号到09年12月31号的文档

    3、近实时搜索

    /** 
         * 【近实时搜索】 
         *  
         * @throws Exception 
         */  
        public void testNRTsearch() throws Exception{  
            Directory dir=new RAMDirectory();  
            IndexWriter writer=new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED);  
            for (int i = 0; i < 10; i++) {  
                Document doc=new Document();  
                doc.add(new Field("id", ""+i, Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS));  
                doc.add(new Field("text", "aaa", Field.Store.NO, Field.Index.ANALYZED ));  
                writer.addDocument(doc);  
            }  
              
            IndexReader reader=writer.getReader();  
            IndexSearcher searcher=new IndexSearcher(reader);  
              
            Query query=new TermQuery(new Term("text","aaa"));  
            TopDocs docs=searcher.search(query, 1);  
            System.out.println("[搜索的总数]"+docs.totalHits);  
              
              
            //先删除id为7的文档,然后添加一个id为22的文档,进行搜索,看是不是近实时的  
            writer.deleteDocuments(new Term("id","7"));  
            Document doc=new Document();  
            doc.add(new Field("id", "22", Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS));  
            doc.add(new Field("text","bbb",Field.Store.NO,Field.Index.ANALYZED));  
            writer.addDocument(doc);  
              
            //重启reader,然后搜索  
            IndexReader newReader=reader.reopen();  
            assertEquals(reader==newReader,false);  
            reader.close();  
            searcher=new IndexSearcher(newReader);  
              
              
            TopDocs hits=searcher.search(query, 10);  
            assertEquals(9, hits.totalHits);  
            query=new TermQuery(new Term("text","bbb"));  
            hits=searcher.search(query, 10);  
            System.out.println("bbb文档的个数:"+hits.totalHits);  
              
            //关闭资源  
            newReader.close();  
            writer.close();  
        }  
  • 相关阅读:
    常见的分布
    ubuntu16.04获取root权限并用root用户登录
    神经网络与深度学习邱锡鹏学习笔记16多项式回归
    什么是公版显卡,什么是非公版显卡
    高考电子监控揭秘
    买了个2手睡袋
    HTML
    又是一天
    我也想去看珠峰
    Qt 主界面菜单栏和状态栏实现
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3211865.html
Copyright © 2011-2022 走看看