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("----------华丽的分割线----------"); } }
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); }