搜索引擎学习(六)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("----------华丽的分割线----------"); } }
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); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律