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();        }    }

相关文章
相关标签/搜索