Lucene搜索过程的核心类

IndexReader

        搜索由IndexWriter类创建的索引

Term

        搜索功能的基本单元,与Filed类似, Term 包括域名和单词 (Filed 包含域名和句子)

Query

TermQuery

TopDocs

  是一个简单的指针容器,一般指向前N个排名的搜索结果

///////////////////////////////////////////////////////////////////////

搜索是一个比较重要的过程,可以根据不同的条件查询出不同的结果

Lucene提供了好多方法进行搜索

4.x 以后的改了好多

   像我们比较常用的

     QueryParser parser =new QueryParser(Version.LUCENE_31, "content", analyzer);

   这个类就没有了,我们可以用BooleanQuery来替代他 ,等等。

  具体 详细方法如下:

(1)通过项(TermQuery)类进行搜索

private void search() {
        try{
        String field = "D://index";
        Directory dir = FSDirectory.open(new File(field));
        IndexReader reader = DirectoryReader.open(dir);
        IndexSearcher searcher = new IndexSearcher(reader);
//        BooleanQuery booleanQuery = new BooleanQuery();
        
        Term term = new Term("content" ,"你");
        Query query = new TermQuery(term);
//        Term term1 = new Term("content" ,"好吧");
//        Query query1 = new TermQuery(term1);
//        booleanQuery.add(query, Occur.SHOULD);
//        booleanQuery.add(query1,Occur.SHOULD);
//        TermQuery query = new TermQuery(term);
        TopDocs topdocs = searcher.search(query, 100);
        ScoreDoc[] scoreDocs = topdocs.scoreDocs;
        System.out.println("查询结果总数---" + topdocs.totalHits+"最大的评分--"+topdocs.getMaxScore());  
        for(int i=0; i < scoreDocs.length; i++) {  
            int doc = scoreDocs[i].doc;  
            Document document = searcher.doc(doc);  
            System.out.println("content===="+document.get("content"));  
            System.out.println("id--" + scoreDocs[i].doc + "---scors--" + scoreDocs[i].score+"---index--"+scoreDocs[i].shardIndex);  
        }  
        reader.close();  
        }catch(Exception e){
            e.printStackTrace();
        }
    }

需要注意的是这个查询方法对查询词的大小写敏感的,所以如果你的数据是对大小写很敏感的话,建议使用此方法,不过得选好合适的分词器

不要在建立索引的时候将大小写统一了。

(2) 通过指定项的范围进行查询( TermRangeQuery)

    private void search() {
        try{
        String field = "D://index";
        Directory dir = FSDirectory.open(new File(field));
        IndexReader reader = DirectoryReader.open(dir);
        IndexSearcher searcher = new IndexSearcher(reader);
//        BooleanQuery booleanQuery = new BooleanQuery();
        TermRangeQuery termRangeQuery = TermRangeQuery.newStringRange("id", "0", "1", true, true);
//        Term term = new Term("content" ,"你");
//        Query query = new TermQuery(term);
//        Term term1 = new Term("content" ,"好吧");
//        Query query1 = new TermQuery(term1);
//        booleanQuery.add(query, Occur.SHOULD);
//        booleanQuery.add(query1,Occur.SHOULD);
//        TermQuery query = new TermQuery(term);
        TopDocs topdocs = searcher.search(termRangeQuery, 100);
        ScoreDoc[] scoreDocs = topdocs.scoreDocs;
        System.out.println("查询结果总数---" + topdocs.totalHits+"最大的评分--"+topdocs.getMaxScore());  
        for(int i=0; i < scoreDocs.length; i++) {  
            int doc = scoreDocs[i].doc;  
            Document document = searcher.doc(doc);  
            System.out.println("content===="+document.get("content"));  
            System.out.println("id--" + scoreDocs[i].doc + "---scors--" + scoreDocs[i].score+"---index--"+scoreDocs[i].shardIndex);  
        }  
        reader.close();  
        }catch(Exception e){
            e.printStackTrace();
        }
    }

该程序查询了id是 0 到1 的索引,true 表示包含边界的意思

(3)

原文地址:https://www.cnblogs.com/tomcattd/p/2889473.html