全文检索 Lucene(3)
看完前两篇博客之后,想必大家对于Lucene的使用都有了一个比较清晰的认识了。如果对Lucene的知识点还是有点模糊的话,个人建议还是先看看这两篇文章。
全文检索 Lucene(1)
全文检索 Lucene(2)
下面来谈一谈使用Lucene查询的分页机制。
分页原理
分页就是为了给用户展现一个逻辑性更强,页面更加紧凑的视图效果。相比于数据库实现的分页,Lucene就显得有点逊色了。毕竟数据库是原生支持的,这点没法改变。
这里说的对Lucene实现的分页机制其实并不是真正的分页,不妨这样想,当我们的TopDocs的大小设置很大,我们的电脑势必会出现内存不足的情况,即使有虚拟内存技术,这也是没办法消除的。这样的话查询机制就会崩溃。这一点我们待会再讲。
Dao层代码实现
由于本例是基于全文检索 Lucene(2)的延伸,所以就不再重新贴出那么多的代码了。这里仅仅是核心逻辑。
页面对象
/**
* @Date 2016年8月1日
*
* @author Administrator
*/
package domain;
import java.util.List;
/**
* @author 郭瑞彪
*
*/
public class Page<T> {
private List<T> lists;
private int totalResults;
public List<T> getLists() {
return lists;
}
public void setLists(List<T> lists) {
this.lists = lists;
}
public int getTotalResults() {
return totalResults;
}
public void setTotalResults(int totalResults) {
this.totalResults = totalResults;
}
@Override
public String toString() {
return "Page [lists=" + lists + ", totalResults=" + totalResults + "]";
}
}
分页方法
/**
* 从索引库中查询
*
* <br>
* 支持分页技术
*
* @param queryString
* 查询字符串
* @return
*/
public Page search(String queryString, int firstResult, int maxResult) {
try {
// 1.queryString -->>Query
String[] queryFields = new String[] { "title", "content" };
Analyzer analyzer = new StandardAnalyzer();
analyzer.setVersion(Version.LUCENE_6_0_0.LUCENE_6_1_0);
QueryParser queryParser = new MultiFieldQueryParser(queryFields, analyzer);
Query query = queryParser.parse(queryString);
// 2. 查询,得到topDocs
IndexSearcher indexSearcher = LuceneUtils.getIndexSearcher();
TopDocs topDocs = indexSearcher.search(query, 100);
// 3.处理结果并返回
int totalHits = topDocs.totalHits;
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
List<Article> articles = new ArrayList<Article>();
int upperBound = (firstResult + maxResult) < scoreDocs.length ? (firstResult + maxResult)
: scoreDocs.length;
firstResult = (firstResult >= 0 ? firstResult : 0);
for (int i = firstResult; i < upperBound; i++) {
ScoreDoc scoreDoc = scoreDocs[i];
Document doc = indexSearcher.doc(scoreDoc.doc);
Article a = ArticleDocumentUtils.document2Article(doc);
articles.add(a);
}
LuceneUtils.closeIndexSearcher(indexSearcher);
// 处理查询结果,返回一个封装好的页面对象
Page<Article> page = new Page();
page.setLists(articles);
page.setTotalResults(totalHits);
return page != null ? page : null;
} catch (Exception e) {
throw new RuntimeException("ArticleIndexDao-->> search方法出错!\n" + e);
}
}
核心释义
我对分页的理解:
以Java面向对象的思维,页面本身就是一个对象。我们不妨现在就打开一个搜索引擎,搜索一下。看看页面结果。大概就能知道底层有什么东西了。
一般来说,做分页一定要知道总的记录数,然后是从哪一页开始分页。这是很有必要的。而且边界值我们也需要好好的进行维护。
int upperBound = (firstResult + maxResult) < scoreDocs.length ? (firstResult + maxResult)
: scoreDocs.length;
firstResult = (firstResult >= 0 ? firstResult : 0);
Lucene伪分页:
下面接着上面没说完的关于Lucene的伪分页。我们也可以从代码中看出
// 2. 查询,得到topDocs
IndexSearcher indexSearcher = LuceneUtils.getIndexSearcher();
TopDocs topDocs = indexSearcher.search(query, 100);
// 3.处理结果并返回
int totalHits = topDocs.totalHits;
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = firstResult; i < upperBound; i++) {
ScoreDoc scoreDoc = scoreDocs[i];
Document doc = indexSearcher.doc(scoreDoc.doc);
Article a = ArticleDocumentUtils.document2Article(doc);
articles.add(a);
}
我们可以看出indexSearcher.search(query, 100);。我们还是查询到了小于等于前100得分项的记录,想象一个这个100设置成10000000000000000呢?结果会怎么样? 估计电脑会受不了的吧。
所以从这里也可以看出,不是任何情况都是适合适用Lucene的,搜们要根据需求来决定。
全文检索 Lucene(3)的更多相关文章
- 全文检索 Lucene(4)
经过了前面几篇文章的学习,我们基本上可以适用Lucene来开发我们的站内搜索应用了.但是观察一下目前的主流的搜索引擎,我们会发现查询结果会有高亮的显示效果.所以,今天我们就来学习一下,给Lucene添 ...
- 全文检索Lucene (2)
接着全文检索Lucene (1) . 下面我们来深入的研究一下,如何使用Lucene! 从全文检索Lucene (1)中我们可以看出,Lucene就好比一个双向的工作流,一方面是对索引库的维护,另一方 ...
- Lucene 全文检索 Lucene的使用
Lucene 全文检索 Lucene的使用 一.简介: 参考百度百科: http://baike.baidu.com/link?url=eBcEVuUL3TbUivRvtgRnMr1s44nTE7 ...
- 全文检索--Lucene & ElasticSearch
全文检索--Lucene 2.1 全文检索和以前高级查询的比较 1.高级查询 缺点:1.like让数据库索引失效 2.每次查询都是查询数据库 ,如果访问的人比较多,压力也是比较大 2.全文检索框架:A ...
- [全文检索]Lucene基础入门.
本打算直接来学习Solr, 现在先把Lucene的只是捋一遍. 本文内容: 1. 搜索引擎的发展史 2. Lucene入门 3. Lucene的API详解 4. 索引调优 5. Lucene搜索结果排 ...
- 全文检索Lucene (1)
Lucene是apache开源的一个全文检索框架,很是出名.今天先来分享一个类似于HelloWorld级别的使用. 工作流程 依赖 我们要想使用Lucene,那就得先引用人家的jar包了.下面列举一下 ...
- 全文检索-Lucene.net
Lucene.net是Lucene的.net移植版本,在较早之前是比较受欢迎的一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎. ...
- 全文检索Lucene框架---查询索引
一. Lucene索引库查询 对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name ...
- ]NET Core Lucene.net和PanGu分词实现全文检索
Lucene.net和PanGu分词实现全文检索 Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考 前言:目前自己在做使用Lucene. ...
随机推荐
- [C#] .NET Core/Standard 2.0 编译时报“CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute”错误的解决办法
作者: zyl910 一.缘由 当创建 .NET Core/Standard 2.0项目时,VS不会像.NET Framework项目一样自动生成AssemblyInfo.cs文件. 而且,若是手工在 ...
- HTTP响应状态解析
100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在请求完成后向客 ...
- Codefroces 850C Arpa and a game with Mojtaba
Description两个人Van♂游戏.给出$n$个正整数$ai$两人轮流操作,每次选出一个素数$p$和一个幂数$k$,选择的前提为该$n$个数中有$p^{k}$的倍数.接着将所有的$p^{k}$的 ...
- [HNOI2011]卡农
题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...
- Codeforces Round #430 C. Ilya And The Tree
Ilya is very fond of graphs, especially trees. During his last trip to the forest Ilya found a very ...
- 基于Spark环境对比Python和Scala语言利弊
在数据挖掘中,Python和Scala语言都是极受欢迎的,本文总结两种语言在Spark环境各自特点. 本文翻译自 https://www.dezyre.com/article/Scala-vs-Py ...
- 计科1702冯亚杰C语言程序设计预备作业
阅读邹欣老师的博客--师生关系,针对文中的几种师生关系谈谈你的看法,你期望的师生关系是什么样的? 答:首先老师和学生之间要互相尊重,我认为这是必要的.在第一点的基础上师生要互相帮助,互相配合,共同进步 ...
- Mysql--七种 Join 查询
Mysql 系列文章主页 =============== 1 准备数据 1.1 建立 Employee 表 DROP TABLE IF EXISTS employee; CREATE TABLE IF ...
- [ Java学习基础 ] Java的抽象类与接口
一.抽象类 1. 抽象类 Java语言提供了两种类:一种是具体类:另一种是抽象子类. 2. 抽象类概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的 ...
- 软件测试assert
之前实习做过一段时间测试,现做个总结: 实习测试的是一款CM系统(case 系统),来记录IT部门处理的维修,服务,反馈,预定服务等case:b/s架构,人少小项目,实习时间短,去了已经快完工,主要测 ...