Lucene的查询及高级内容
Lucene查询
基本查询:
@Test
public void baseQuery() throws Exception {
//1. 创建查询的核心对象
FSDirectory d = FSDirectory.open(new File("H:\\test"));
IndexReader reader = DirectoryReader.open(d);
IndexSearcher indexSearcher = new IndexSearcher(reader); //2. 执行查询
QueryParser queryParser = new QueryParser("content", new IKAnalyzer());
Query query = queryParser.parse("剑来");
TopDocs topDocs = indexSearcher.search(query, 10); //3. 获取文档id
ScoreDoc[] scoreDocs = topDocs.scoreDocs; //获取得分文档集合
for (ScoreDoc scoreDoc : scoreDocs) {
int id = scoreDoc.doc;//获取文档id
float score = scoreDoc.score;// 返回此文档的匹配度 Document doc = indexSearcher.doc(id);
String docId = doc.get("id");
String content = doc.get("content");
System.out.println(docId + " " + content + " " + "匹配度:" + score);
}
}
多样化查询:
//提取一个查询的方法
public void query(Query query) throws Exception { //1. 创建 查询的核心对象
IndexReader reader = DirectoryReader.open(FSDirectory.open(new File("H:\\test")));
IndexSearcher indexSearcher = new IndexSearcher(reader); //3. 执行查询
TopDocs topDocs = indexSearcher.search(query, 10); ScoreDoc[] scoreDocs = topDocs.scoreDocs;//获取得分文档的集合
for (ScoreDoc scoreDoc : scoreDocs) {
//获取文档id
int docId = scoreDoc.doc;
//获取文档得分
float score = scoreDoc.score;
//根据id获取文档
Document doc = indexSearcher.doc(docId);
String content = doc.get("content");
String title = doc.get("title");
System.out.println("匹配度:" + score + content + " " + title); }
} // 词条查询
@Test
public void termQuery() throws Exception {
//创建词条对象
//注意: 词条是不可在分割的, 词条可以是一个字, 也可以是一句话
//使用场景: 主要是针对的是不可在分割的字段, 例如id
//由于其不可再分, 可以搜索 全文, 但是不能搜索 全文检索
TermQuery termQuery = new TermQuery(new Term("content", "全文"));
query(termQuery);
} // 通配符查询
@Test
public void wildcardQuery() throws Exception { //通配符:
//*: 代表多个字符
//?: 代表一个占位符
WildcardQuery wildcardQuery = new WildcardQuery(new Term("content", "?uce*"));
query(wildcardQuery); } //模糊查询
@Test
public void fuzzQuery() throws Exception {
/**
* 模糊查询:
* 指的是通过替换, 补位, 移动 能够在二次切换内查询数据即可返回
* 参数1: term 指定查询的字段和内容
* 参数2: int n 表示最大编辑的次数 最大2
*
*/
FuzzyQuery fuzzyQuery = new FuzzyQuery(new Term("content", "lucene"), 1);
query(fuzzyQuery);
} // 数值范围查询
@Test
public void numericRangeQuery() throws Exception {
/**
* 获取NumericRangeQuery的方式:
* 通过提供的静态方法获取:
* NumericRangeQuery.newIntRange()
* NumericRangeQuery.newFloatRange()
* NumericRangeQuery.newDoubleRange()
* NumericRangeQuery.newLongRange()
*
*
* 数值范围查询:
* 参数1: 指定要查询的字段
* 参数2: 指定要查询的开始值
* 参数3: 指定要查询的结束值
* 参数4: 是否包含开始
* 参数5: 是否包含结束
*/ NumericRangeQuery numericRangeQuery = NumericRangeQuery.newIntRange("id", 2, 4, false, false);
query(numericRangeQuery);
} // 组合查询
@Test
public void testBooleanQuery() throws Exception { Query query1 = NumericRangeQuery.newLongRange("id", 2l, 4l, true, true);
Query query2 = NumericRangeQuery.newLongRange("id", 0l, 3l, true, true); // boolean查询本身没有查询条件,它可以组合其他查询
BooleanQuery query = new BooleanQuery();
// 交集: Occur.MUST + Occur.MUST
// 并集:Occur.SHOULD + Occur.SHOULD
// 非:Occur.MUST_NOT
query.add(query1, BooleanClause.Occur.SHOULD);
query.add(query2, BooleanClause.Occur.SHOULD); query(query);
}
Lucene高级内容:
高亮:
// 高亮显示
@Test
public void testHighlighter() throws Exception {
// 目录对象
Directory directory = FSDirectory.open(new File("H:\\test"));
// 创建读取工具
IndexReader reader = DirectoryReader.open(directory);
// 创建搜索工具
IndexSearcher searcher = new IndexSearcher(reader); QueryParser parser = new QueryParser("title", new IKAnalyzer());
Query query = parser.parse("谷歌地图"); // 格式化器
Formatter formatter = new SimpleHTMLFormatter("<em>", "</em>");
Scorer scorer = new QueryScorer(query);
// 准备高亮工具
Highlighter highlighter = new Highlighter(formatter, scorer);
// 搜索
TopDocs topDocs = searcher.search(query, 10);
System.out.println("本次搜索共" + topDocs.totalHits + "条数据"); ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
// 获取文档编号
int docID = scoreDoc.doc;
Document doc = reader.document(docID);
System.out.println("id: " + doc.get("id")); String title = doc.get("title");
// 用高亮工具处理普通的查询结果,参数:分词器,要高亮的字段的名称,高亮字段的原始值
String hTitle = highlighter.getBestFragment(new IKAnalyzer(), "title", title); System.out.println("title: " + hTitle);
// 获取文档的匹配度
System.out.println("匹配度:" + scoreDoc.score);
}
}
排序:
// 排序
@Test
public void testSortQuery() throws Exception {
// 目录对象
Directory directory = FSDirectory.open(new File("H:\\test"));
// 创建读取工具
IndexReader reader = DirectoryReader.open(directory);
// 创建搜索工具
IndexSearcher searcher = new IndexSearcher(reader); QueryParser parser = new QueryParser("title", new IKAnalyzer());
Query query = parser.parse("谷歌地图"); // 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序
Sort sort = new Sort(new SortField("id", Type.LONG, true));
// 搜索
TopDocs topDocs = searcher.search(query, 10,sort);
System.out.println("本次搜索共" + topDocs.totalHits + "条数据"); ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
// 获取文档编号
int docID = scoreDoc.doc;
Document doc = reader.document(docID);
System.out.println("id: " + doc.get("id"));
System.out.println("title: " + doc.get("title"));
}
}
分页:
@Test
public void testPageQuery() throws Exception {
// 实际上Lucene本身不支持分页。因此我们需要自己进行逻辑分页。我们要准备分页参数:
int pageSize = 2;// 每页条数
int pageNum = 3;// 当前页码
int start = (pageNum - 1) * pageSize;// 当前页的起始条数
int end = start + pageSize;// 当前页的结束条数(不能包含) // 目录对象
Directory directory = FSDirectory.open(new File("H:\\test"));
// 创建读取工具
IndexReader reader = DirectoryReader.open(directory);
// 创建搜索工具
IndexSearcher searcher = new IndexSearcher(reader); QueryParser parser = new QueryParser("title", new IKAnalyzer());
Query query = parser.parse("谷歌地图"); // 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序
Sort sort = new Sort(new SortField("id", Type.LONG, false));
// 搜索数据,查询0~end条
TopDocs topDocs = searcher.search(query, end,sort);
System.out.println("本次搜索共" + topDocs.totalHits + "条数据"); ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = start; i < end; i++) {
ScoreDoc scoreDoc = scoreDocs[i];
// 获取文档编号
int docID = scoreDoc.doc;
Document doc = reader.document(docID);
System.out.println("id: " + doc.get("id"));
System.out.println("title: " + doc.get("title"));
}
}
加权因子:
Lucene会对搜索的结果的匹配度进行一个加分, 用来表示数据和词条关联性的强弱, 得分越高, 表示匹配度越高, 排名越靠前
Lucene支持对某一个字段设置加权因子, 来提高其打分, 使其排名更加靠前, 这样当用户搜索的时候, 便可以将此词条对应的文档展示在最前面
TextField textField = new TextField("content","lucene加权因子", Store.YES);
textField.setBoost(10);
Lucene的查询及高级内容的更多相关文章
- 全文检索Lucene框架---查询索引
一. Lucene索引库查询 对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name ...
- Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser
一.Lucene的查询语法 Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html (1) 语法关键字 + ...
- Hibernate Search集与lucene分词查询
lucene分词查询参考信息:https://blog.csdn.net/dm_vincent/article/details/40707857
- Lucene的查询语法,JavaCC及QueryParser(1)
http://www.cnblogs.com/forfuture1978/archive/2010/05/08/1730200.html 一.Lucene的查询语法 Lucene所支持的查询语法可见h ...
- Centos中查询目录中内容命名ls
首先解释下这块, root代表当前登录用户,localhost代表主机名, ~代表当前主机目录, #代表用户权限 #表示超级用户,$表示普通用户: 查询目录中内容命令 ls (list缩写) ...
- Centos中查询目录中内容命名ls(六)
首先解释下这块, root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,#代表用户权限 #表示超级用户,$表示普通用户: 查询目录中内容命令 ls (list缩写) 格式 l ...
- Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser 2014-06-25 14:25 722人阅读 评论(1) 收藏
一.Lucene的查询语法 Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html (1) 语法关键字 + ...
- (四)Centos之查询目录中内容命名ls
一.查询目录中内容命名ls 1.1 root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,#代表用户权限 #表示超级用户,$表示普通用户: 1.2 查询目录中内容命令 ls ...
- mybatis关联查询基础----高级映射
本文链接地址:mybatis关联查询基础----高级映射(一对一,一对多,多对多) 前言: 今日在工作中遇到了一个一对多分页查询的问题,主表一条记录对应关联表四条记录,关联分页查询后每页只显示三条记录 ...
随机推荐
- Oracle12c之 CDB数据库中数据字典架构
数据字典就是元数据的集合,比如创建的表,列,约束,触发器等等这些都是元数据,需要保存到数据库中.除此之外,Oracle自身的一些数据库对象,如目录,PL/SQL代码等等这些都是元数据,都需要存放在数据 ...
- Jmeter接口压测小思路
1.压力接口测试分2种:一种是单场景,压一个接口:第二种是混合场景,多个有关联的接口.压测时间,一般场景都运行10-15分钟.如果是疲劳测试,可以压一天或一周,根据实际情况定. 2.压测前要明确压测功 ...
- git 修改本地分支名称和远程分支名称
branch-A 为旧分支名称 branch-B 为新分支名称 修改本地分支名称 $ git branch -m branch-A branch-B 删除远程分支 $ git push origin ...
- 登录MySQL非默认3306端口号的语句
这里登陆的是mysql3308端口号的数据库 mysql -P3308 -p用户名 -u密码
- GOF23设计模式之命令模式(command)
一.命令模式概述 将一个请求封装到一个对象,从而使得可用不同的请求对客户进行参数化. 二.命令模式结构 (1)Command 抽象命令类 (2)ConcreteCommand 具体命令类 (3)Inv ...
- struts2学习(15)struts2防重复提交
一.重复提交的例子: 模拟一种情况,存在延时啊,系统比较繁忙啊啥的. 模拟延迟5s钟,用户点了一次提交,又点了一次提交,例子中模拟这种情况: 这样会造成重复提交: com.cy.action.St ...
- 【AR实验室】mulberryAR:并行提取ORB特征
本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 在[AR实验室]mulberryAR : ORBSLAM2+VVSION末尾提及了iPhone5s真机测试结果,其中 ...
- POJ 2674 Linear world(弹性碰撞)
Linear world Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4426 Accepted: 1006 Desc ...
- ORA-01146: cannot start online backup - file 1 is already in backup ORA-01110: data file 1: 'C:\ORACLE\ORADATA\ORCL8\SYSTEM01.DBF'
问题: Error: [1146] ORA-01146: cannot start online backup - file 1 is already in backup ORA-01110: dat ...
- 20181122_C#中AOP_使用Unity实现AOP
一. 使用Unity的AOP实现 a) 整体项目截图: b) 添加Unity的Nuget包, 直接使用最新版就行, 需要添加两个 Unity 和 Unity.Interceptio ...