搜索引擎学习(六)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);
    }

猜你喜欢

转载自www.cnblogs.com/riches/p/11479027.html
今日推荐