zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    用python实现average()函数,使得当可变参数长度为0的时候,也能正确返回结果。
    请用python实现函数func,当参数类型为list时,返回list中所有数字类型元素的和,当参数类型为tuple时,返回tuple中所有数字类型元素的乘积。
    用python实现循环和递归的形式定义函数,求出1~100的和。
    python实现0~100的平方和,用sum()函数接收一个list作为参数,并返回list所有元素之和。请计算 1*1 + 2*2 + 3*3 + ... + 100*100。
    用python实现线性回归
    IE11用JS检测判断
    Google Chrome的CSS hack写法
    javascript间窗口互相通信,window.open新建窗口保存父窗口对象
    解决IE6不支持css min-width与min-height
    CSS实现兼容性的渐变背景(gradient)效果(转)
  • 原文地址:https://www.cnblogs.com/tomcattd/p/2889473.html
Copyright © 2011-2022 走看看