lucene之IndexSearcher

    public void searchByTerm(String field,String name,int num) {
        try {
            IndexSearcher searcher = getSearcher();
            Query query = new TermQuery(new Term(field,name));//它只能針對一個字段進行查詢。
            TopDocs tds = searcher.search(query, num);
            System.out.println("一共查詢了:"+tds.totalHits);
            for(ScoreDoc sd:tds.scoreDocs) {
                Document doc = searcher.doc(sd.doc);
                System.out.println(doc.get("id")+"---->"+
                        doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
                        doc.get("attach")+","+doc.get("date"));
            }
            searcher.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }apache

public void searchByTermRange(String field,String start,String end,int num) {
        try {
            IndexSearcher searcher = getSearcher();
            Query query = new TermRangeQuery(field,start,end,true, true);
            /*TermRangeQuery:主要用於文本範圍查找;左邊界是start 右邊界是end(a,c)那麼就是b
             * Parameters:
             field – The field that holds both lower and upper terms.
             lowerTerm – The term text at the lower end of the range
             upperTerm – The term text at the upper end of the range
             includeLower – If true, the lowerTerm is included in the range.
             includeUpper – If true, the upperTerm is included in the range.
             * */
            TopDocs tds = searcher.search(query, num);
            System.out.println("一共查詢了:"+tds.totalHits);
            for(ScoreDoc sd:tds.scoreDocs) {
                Document doc = searcher.doc(sd.doc);
                System.out.println(doc.get("id")+"---->"+
                        doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
                        doc.get("attach")+","+doc.get("date"));
            }
            searcher.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }對象

public void searchByNumricRange(String field,int start,int end,int num) {
        try {
            IndexSearcher searcher = getSearcher();
            Query query = NumericRangeQuery.newIntRange(field,start, end,true,true);
            TopDocs tds = searcher.search(query, num);
            System.out.println("一共查詢了:"+tds.totalHits);
            for(ScoreDoc sd:tds.scoreDocs) {
                Document doc = searcher.doc(sd.doc);
                System.out.println(doc.get("id")+"---->"+
                        doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
                        doc.get("attach")+","+doc.get("date"));
            }
            searcher.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }get

public void searchByPrefix(String field,String value,int num) {it

//搜索 field裏以value爲開始的recordio

       try {
            IndexSearcher searcher = getSearcher();
            Query query = new PrefixQuery(new Term(field,value));
            TopDocs tds = searcher.search(query, num);
            System.out.println("一共查詢了:"+tds.totalHits);
            for(ScoreDoc sd:tds.scoreDocs) {
                Document doc = searcher.doc(sd.doc);
                System.out.println(doc.get("id")+"---->"+
                        doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
                        doc.get("attach")+","+doc.get("date"));
            }
            searcher.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
        public void searchByWildcard(String field,String value,int num) {
        try {
            IndexSearcher searcher = getSearcher();
            //在傳入的value中能夠使用通配符:?和*,?表示匹配一個字符,*表示匹配任意多個字符
            Query query = new WildcardQuery(new Term(field,value));
            TopDocs tds = searcher.search(query, num);
            System.out.println("一共查詢了:"+tds.totalHits);
            for(ScoreDoc sd:tds.scoreDocs) {
                Document doc = searcher.doc(sd.doc);
                System.out.println(doc.get("id")+"---->"+
                        doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
                        doc.get("attach")+","+doc.get("date"));
            }
            searcher.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }ast

    public void searchByBoolean(int num) {
        try {
            IndexSearcher searcher = getSearcher();
            BooleanQuery query = new BooleanQuery();
            /*
             * BooleanQuery能夠鏈接多個子查詢
             * Occur.MUST表示必須出現
             * Occur.SHOULD表示能夠出現
             * Occur.MUSE_NOT表示不能出現
             */
            query.add(new TermQuery(new Term("name","zhangsan")), Occur.MUST_NOT);
            query.add(new TermQuery(new Term("content","game")),Occur.SHOULD);
            TopDocs tds = searcher.search(query, num);
            System.out.println("一共查詢了:"+tds.totalHits);
            for(ScoreDoc sd:tds.scoreDocs) {
                Document doc = searcher.doc(sd.doc);
                System.out.println(doc.get("id")+"---->"+
                        doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
                        doc.get("attach")+","+doc.get("date"));
            }
            searcher.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }效率

public void searchByFuzzy(int num) {
        try {
            IndexSearcher searcher = getSearcher();
            FuzzyQuery query = new FuzzyQuery(new Term("name","mase"),0.4f,0);
            System.out.println(query.getPrefixLength());
            System.out.println(query.getMinSimilarity());
            TopDocs tds = searcher.search(query, num);
            System.out.println("一共查詢了:"+tds.totalHits);
            for(ScoreDoc sd:tds.scoreDocs) {
                Document doc = searcher.doc(sd.doc);
                System.out.println(doc.get("id")+"---->"+
                        doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
                        doc.get("attach")+","+doc.get("date"));
            }
            searcher.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }email

//一、建立QueryParser對象,默認搜索域爲content
        QueryParser parser = new QueryParser(Version.LUCENE_35, "content", new StandardAnalyzer(Version.LUCENE_35));
        //改變空格的默認操做符,如下能夠改爲AND
        //parser.setDefaultOperator(Operator.AND);
        //開啓第一個字符的通配符匹配,默認關閉由於效率不高
        parser.setAllowLeadingWildcard(true);
        //搜索content中包含有like的
        Query query = parser.parse("like");
        
        //有basketball或者football的,空格默認就是OR
        query = parser.parse("basketball football");
        
        //改變搜索域爲name爲mike
        //query = parser.parse("content:like");
        
        //一樣能夠使用*和?來進行通配符匹配
//        query = parser.parse("name:j*");
        
        //通配符默認不能放在首位
//        query = parser.parse("email:*@itat.org");
        
        //匹配name中沒有mike可是content中必須有football的,+和-要放置到域說明前面
        query = parser.parse("- name:mike + like");
        
        //匹配一個區間,注意:TO必須是大寫
        //query = parser.parse("id:[1 TO 6]");
        
        //閉區間匹配只會匹配到2
        //query = parser.parse("id:{1 TO 3}");
        
        //徹底匹配I Like Football的
        //query = parser.parse("\"I like football\"");
        
        //匹配I 和football之間有一個單詞距離的
        //query = parser.parse("\"I football\"~1");
        
        //模糊查詢
        //query = parser.parse("name:make~");
        
        //沒有辦法匹配數字範圍(本身擴展Parser)
        //query = parser.parse("attach:[2 TO 10]");
        su.searchByQueryParse(query, 10);擴展

public void searchByQueryParse(Query query,int num) {
        try {
            IndexSearcher searcher = getSearcher();
            TopDocs tds = searcher.search(query, num);
            System.out.println("一共查詢了:"+tds.totalHits);
            for(ScoreDoc sd:tds.scoreDocs) {
                Document doc = searcher.doc(sd.doc);
                System.out.println(doc.get("id")+"---->"+
                        doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
                        doc.get("attach")+","+doc.get("date")+"=="+sd.score);
            }
            searcher.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }date

public void searchPage(String query,int pageIndex,int pageSize) {        try {            Directory dir = FileIndexUtils.getDirectory();            IndexSearcher searcher = getSearcher(dir);            QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));            Query q = parser.parse(query);            TopDocs tds = searcher.search(q, 500);            ScoreDoc[] sds = tds.scoreDocs;            int start = (pageIndex-1)*pageSize;            int end = pageIndex*pageSize;            for(int i=start;i<end;i++) {                Document doc = searcher.doc(sds[i].doc);                System.out.println(sds[i].doc+":"+doc.get("path")+"-->"+doc.get("filename"));            }                        searcher.close();        } catch (org.apache.lucene.queryParser.ParseException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }        /**     * 根據頁碼和分頁大小獲取上一次的最後一個ScoreDoc     */    private ScoreDoc getLastScoreDoc(int pageIndex,int pageSize,Query query,IndexSearcher searcher) throws IOException {        if(pageIndex==1)return null;//若是是第一頁就返回空        int num = pageSize*(pageIndex-1);//獲取上一頁的數量        TopDocs tds = searcher.search(query, num);        return tds.scoreDocs[num-1];    }        public void searchPageByAfter(String query,int pageIndex,int pageSize) {        try {            Directory dir = FileIndexUtils.getDirectory();            IndexSearcher searcher = getSearcher(dir);            QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));            Query q = parser.parse(query);            //先獲取上一頁的最後一個元素            ScoreDoc lastSd = getLastScoreDoc(pageIndex, pageSize, q, searcher);            //經過最後一個元素搜索下頁的pageSize個元素            TopDocs tds = searcher.searchAfter(lastSd,q, pageSize);            for(ScoreDoc sd:tds.scoreDocs) {                Document doc = searcher.doc(sd.doc);                System.out.println(sd.doc+":"+doc.get("path")+"-->"+doc.get("filename"));            }            searcher.close();        } catch (org.apache.lucene.queryParser.ParseException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }        public void searchNoPage(String query) {        try {            Directory dir = FileIndexUtils.getDirectory();            IndexSearcher searcher = getSearcher(dir);            QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));            Query q = parser.parse(query);            TopDocs tds = searcher.search(q, 20);            ScoreDoc[] sds = tds.scoreDocs;            for(int i=0;i<sds.length;i++) {                Document doc = searcher.doc(sds[i].doc);                System.out.println(sds[i].doc+":"+doc.get("path")+"-->"+doc.get("filename"));            }                        searcher.close();        } catch (org.apache.lucene.queryParser.ParseException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }

相關文章
相關標籤/搜索