zoukankan      html  css  js  c++  java
  • 搜索引擎学习(六)Query的子类查询

    Query的子类查询

    PS:这是通用代码,下面的子类查询调用到的时候就不再写这部分的具体的实现过程了

        /**
         * 构造IndexSearcher对象
         *
         * @return
         * @throws Exception
         */
        private IndexSearcher getIndexSearcher() throws Exception {
            /*创建一个Directory对象,指定索引库的位置*/
            Directory directory = FSDirectory.open(new File("E:\zhanghaoBF\luceneSolr\indexLibrary").toPath());//磁盘(硬盘)上的路径
            /*创建一个IndexReader(索引读取)对象*/
            IndexReader indexReader = DirectoryReader.open(directory);//打开索引库(此对象为流对象)
            /*创建一个IndexSearcher(索引搜索)对象*/
            IndexSearcher indexSearcher = new IndexSearcher(indexReader);
            return indexSearcher;//索引对象
        }
    
        /**
         * 执行查询并打印结果
         *
         * @param query
         * @param indexSearcher
         * @throws Exception
         */
        private void printResult(Query query, IndexSearcher indexSearcher) throws Exception {
            /*执行查询*/
            TopDocs topDocs = indexSearcher.search(query, 10);//根据query搜索,返回评分最高的10条
    
            /*返回查询结果,遍历查询结果并输出*/
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;//PS:注意这里返回的是文档id的数组
            for (ScoreDoc scoreDoc : scoreDocs) {
                int docId = scoreDoc.doc;//文档ID
                Document document = indexSearcher.doc(docId);//对应的文档
    
                String fileName = document.get("fileName");//文件名称
                System.out.println(fileName);
                String fileSize = document.get("fileSize");//文件大小
                System.out.println(fileSize);
                String filePath = document.get("filePath");//文件路径
                System.out.println(filePath);
                System.out.println("----------华丽的分割线----------");
            }
        }
    View Code

    MatchAllDocsQuery

    MatchAllDocsQuery子类查询方法的作用是查询索引目录下的所有文档id数组。

        /**
         * 查询索引目录下的所有文档
         *
         * @throws Exception
         */
        @Test
        public void testMatchAllDocsQuery() throws Exception {
            //获取IndexSearcher(索引搜索)对象
            IndexSearcher indexSearcher = getIndexSearcher();
            //新建查询子类对象
            Query query = new MatchAllDocsQuery();
            //执行查询并打印结果
            printResult(query, indexSearcher);
        }

    TermQuery

    TermQuery子类查询方法的作用是对指定的域关键词进行精准查询

        /**
         * 对指定的域和关键词进行精准查询
         *
         * @throws Exception
         */
        @Test
        public void testTermQuery() throws Exception {
            //获取IndexSearcher(索引搜索)对象
            IndexSearcher indexSearcher = getIndexSearcher();
            //构造查询条件
            Term condition = new Term("fileContent", "lucene");
            //新建查询子类对象
            Query query = new TermQuery(condition);
            //执行查询并打印结果
            printResult(query, indexSearcher);
        }

    LongPoint.newRangeQuery(老版本用的NumericRangQuery)

    LongPoint.newRangeQuery子类查询方法的作用是查询域长度在指定范围内的文档id数组。

        /**
         * 根据数值范围查询
         *
         * @throws Exception
         */
        @Test
        public void testNumericRangQuery() throws Exception {
            //获取IndexSearcher(索引搜索)对象
            IndexSearcher indexSearcher = getIndexSearcher();
            //新建查询子类对象(老版本用的是NumericRangQuery)
            Query query = LongPoint.newRangeQuery("fileSize", 1L, 200L);//查询长度在1-200之间的索引文档id数组
            //执行查询并打印结果
            printResult(query, indexSearcher);
        }

    BooleanQuery.Builder(老版本不用指定builder,可以直接new出BooleanQuery对象后直接添加query条件)

    BooleanQuery.Builder子类查询方法的作用是组合条件查询(多条件查询)。

     /**
         * 组合查询(多条件查询)
         *
         * BooleanClause.Occur.MUST(必须满足此条件)【相当于sql中的and】
         * BooleanClause.Occur.SHOULD(可以满足也可以不满足)【相当于sql中的or】
         * BooleanClause.Occur.MUST_NOT(必须不满足此条件)【相当于sql中的not】
         *
         * @throws Exception
         */
        @Test
        public void testBooleanQuery() throws Exception {
            //获取IndexSearcher(索引搜索)对象
            IndexSearcher indexSearcher = getIndexSearcher();
    
            //构造查询条件
            Query query1 = new TermQuery(new Term("fileName", "lucene"));
            Query query2 = new TermQuery(new Term("fileContent", "lucene"));
    
            //新建查询子类对象(老版本不用指定builder,可以直接new出BooleanQuery对象后直接添加query条件)
            BooleanQuery.Builder builder = new BooleanQuery.Builder();
            builder.add(query1, BooleanClause.Occur.MUST);
            builder.add(query2, BooleanClause.Occur.MUST);
            BooleanQuery booleanQuery = builder.build();
    
            //执行查询并打印结果
            printResult(booleanQuery, indexSearcher);
        }
  • 相关阅读:
    赫夫曼树相关算法
    用栈来实现 括号匹配 字符序列检验
    二叉树的建立和遍历
    数据结构-算术表达式求值
    构造一个单链表L,其头结点指针为head,编写程序实现将L逆置
    单链表的基本操作(C语言)数据结构
    java代码打印杨辉三角
    无标题
    写一个方法,判断给定的数字是偶数还是奇数
    关于生物信息学与R的相关资料和网站
  • 原文地址:https://www.cnblogs.com/riches/p/11479027.html
Copyright © 2011-2022 走看看