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)

  • 相关阅读:
    java并发
    jvm虚拟机
    L2Dwidget二次元前端添加人物插件
    MySQL数据库之rowid
    MySql支持emoji表情设置
    zookeeper不能正常启动问题(转)
    jd-gui-windows-1.6.6.zip反编译工具
    为什么es集群至少需要三个节点(转)
    超好用的uniapp弹出层
    netcore5.0 使用新的Microsoft.Data.SqlClient
  • 原文地址:https://www.cnblogs.com/tomcattd/p/2889473.html
Copyright © 2011-2022 走看看