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);
}

搜索引擎学习(六)Query的子类查询的更多相关文章

  1. 搜索引擎学习(三)Lucene查询索引

    一.查询理论 创建查询:构建一个包含了文档域和语汇单元的文档查询对象.(例:fileName:lucene) 查询过程:根据查询对象的条件,在索引中找出相应的term,然后根据term找到对应的文档i ...

  2. nodejs 学习六 express 三种查询url参数方法

    req.param() 是被废弃的api req.params 俗点:取带冒号的参数 req.body 可以肯定的一点是req.body一定是post请求,express里依赖的中间件必须有bodyP ...

  3. lucene查询索引之Query子类查询——(七)

    0.文档名字:(根据名字索引查询文档)

  4. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  5. 云计算设计模式(六)——命令和查询职责分离(CQRS)模式

    云计算设计模式(六)——命令和查询职责分离(CQRS)模式 隔离,通过使用不同的接口,从操作读取数据更新数据的操作.这种模式可以最大限度地提高性能,可扩展性和安全性;支持系统在通过较高的灵活性,时间的 ...

  6. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  7. Hbase深入学习(六) Java操作HBase

    Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...

  8. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...

  9. (转)MyBatis框架的学习(六)——MyBatis整合Spring

    http://blog.csdn.net/yerenyuan_pku/article/details/71904315 本文将手把手教你如何使用MyBatis整合Spring,这儿,我本人使用的MyB ...

随机推荐

  1. Clickhouse单机及集群部署详解

    一.ClickHouse简介 ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域.目前国内社区火热,各个大厂纷纷跟进大规模使用: 今日头条 内部用ClickHous ...

  2. MyISAM 和InnoDB的区别

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISA ...

  3. QPS过万,redis大量连接超时怎么解决?

    7月2号10点后,刚好某个负责的服务发生大量的redis连接超时的异常(redis.clients.jedis.exceptions.JedisConnectionException),由于本身的数据 ...

  4. Kernel methods on spike train space for neuroscience: a tutorial

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 时序点过程:http://www.tensorinfinity.com/paper_154.html Abstract 在过去的十年中,人 ...

  5. Jmeter+Ant+jenkins实现api自动化测试的持续集成

    0基础上手教程 @jmeter的使用 jmeter是一个基于java语言编写的开源测试工具,广泛应用于接口测试,性能测试,自动化测试. 接口自动化的编写教程,将于后续分享. 问题一:为什么用ant,而 ...

  6. 牛客网PAT-练兵场-挖掘机技术哪家强

    题目地址:https://www.nowcoder.com/pat/6/problem/4058 题解:用数组下标当学校编号.输入一次数据的时候,直接在相应数组下标位置累加内容,同时更新最大的总分的学 ...

  7. java23种设计模式—— 一、设计模式介绍

    Java23种设计模式全解析 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模 ...

  8. oeasy 教您玩转linux010101查看内核uname

    linux([?l?n?ks]) 是什么????? 咱们这次讲点什么呢?这次咱们讲讲这个 linux([?l?n?ks]),什么是 linux([?l?n?ks])呢?这linux([?l?n?ks] ...

  9. android 数据绑定(6)自定义绑定方法、双向数据绑定

    1.官方文档 https://developer.android.com/topic/libraries/data-binding/binding-adapters https://developer ...

  10. 【平台开发】— 4.mysql建库建表

    本想着把前端脚手架run起来了,然后就可以借着登录来捋一下前后端交互的过程.但是后端导入JPA的时候就发现了,还没有数据库. 既然是本着学习的目的,那咱也不想只在后端写死返回的数据,要做就做全套. 一 ...