Lucene查询索引(分页)
分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能
Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录
package cn.mylucene; import java.io.IOException;
import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.queryparser.classic.QueryParser.Operator;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.SearcherFactory;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.SortField.Type;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory; public class SearchIndex {
public static void main(String[] args) throws IOException, ParseException { String queryString="title:\"国\"";
Analyzer analyzer = new StandardAnalyzer(); //StandardAnalyzer:汉字一个一个字拆分索引
IndexSearcher is = getIndexSearcher();
QueryParser parser=new QueryParser("", analyzer);
parser.setDefaultOperator(Operator.AND);//默认状态下,空格被认为是OR的关系,设置为空格为AND
Query query = parser.parse(queryString);
//排序
Sort sort = new Sort(new SortField("dt", Type.LONG, true));
TopDocs topDocs = is.search(query, 20,sort);
System.out.println("总共匹配多少个:" + topDocs.totalHits);
//获取查询结果集
ScoreDoc[] hits = topDocs.scoreDocs; int pageSize=5;//每页显示记录数
int curPage=2;//当前页
//查询起始记录位置
int begin = pageSize * (curPage - 1);
//查询终止记录位置
int end = Math.min(begin + pageSize, hits.length);
//遍历结果集
for(int i=begin;i<end;i++) {
int docID = hits[i].doc;
Document document = is.doc(docID);
System.out.println(document.get("id")+"-"+document.get("name")+"-"+document.get("dt")+"-"+document.get("title"));
}
closeIndexSearcher(is);
} /*
* 解决:实现实时搜索功能
* 解决:在读取索引文件内容时,索引文件的打开操作IndexSearcher是个非常耗时耗资源的操作
* */
private static byte[] synchronized_r = new byte[0];
private static SearcherManager searcherManager = null;
private static IndexSearcher getIndexSearcher() throws IOException {
IndexSearcher indexSearcher = null;
//保证在同一时刻最多只有一个线程执行该段代码
synchronized (synchronized_r) {
if(searcherManager == null) {
searcherManager = new SearcherManager(FSDirectory.open(Paths.get("E:\\LuceneIndex")), new SearcherFactory());
}
/*
* 这个方法同DirectoryReader.openIfChanged(dirReader)效果一样,其实底层还是调用的该方法实现的
* DirectoryReader.openIfChanged(dirReader)可以判断当前Reader对象的索引有没有被修改过
* 如果索引文件被更新过则重新加载该索引目录
* 但是这个时候的重新加载则比单纯的open(indexPath)要高效很多
* 它只是重新加载被更新过的文档,而单纯的open则是加载全部的文档
* */
searcherManager.maybeRefresh();
//借用一个IndexSearcher对象的引用,记住该对象用完之后要归还的,有借有还再借不难
indexSearcher = searcherManager.acquire();
}
return indexSearcher;
} private static void closeIndexSearcher(IndexSearcher indexSearcher) throws IOException {
if(indexSearcher != null) {
searcherManager.release(indexSearcher);//归还从SearcherManager处借来的IndexSearcher对象
}
indexSearcher = null;
}
}
Lucene查询索引(分页)的更多相关文章
- lucene查询索引库、分页、过滤、排序、高亮
2.查询索引库 插入测试数据 xx.xx. index. ArticleIndex @Test public void testCreateIndexBatch() throws Exception{ ...
- Lucene查询索引
索引创建 以新闻文档为例,每条新闻是一个document,新闻有news_id.news_title.news_source.news_url.news_abstract.news_keywords这 ...
- lucene查询索引之QueryParser解析查询——(八)
0.语法介绍:
- lucene查询索引之Query子类查询——(七)
0.文档名字:(根据名字索引查询文档)
- 搜索引擎学习(三)Lucene查询索引
一.查询理论 创建查询:构建一个包含了文档域和语汇单元的文档查询对象.(例:fileName:lucene) 查询过程:根据查询对象的条件,在索引中找出相应的term,然后根据term找到对应的文档i ...
- 第六步:Lucene查询索引(优化一)
package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...
- 第六步:Lucene查询索引
package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...
- lucene 查询+分页+排序
lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...
- Lucene 查询分页技术
常用的Lucene查询代码如下所示,该代码的作用是将path路径下的所有索引信息返回 public String matchAll(String path) { try { Directory dir ...
随机推荐
- 在visual studio2012中如何使用localDB具体讲解
http://www.cnblogs.com/zhangran/archive/2012/08/26/2657864.html 说明: 经过一段时间的小捉摸终于基本掌握在vs2012中如何使用loca ...
- Linux命令详解:[7]获得命令帮助
在维护和使用Linux系统时,常常会忘记命令的使用方法,如果旁边又没有相应的资料,那怎么办呢?不用担心,系统本身提供了详细的手册供使用者查询,下面小编就以CentOS6.4系统为例演示如何获得命令帮助 ...
- PHP利用Filesystem函数实现操作缓存(生成,获取,删除操作)
<?php class File{ //$key 相当于缓存文件的文件名 //$value 缓存数据 private $_dir;//定义默认路径 const EXT='.txt'; publi ...
- 工具分享——将C#文档注释生成.chm帮助文档
由于最近需要把以前的一个项目写一个文档,但一时又不知道写成怎样的,又恰好发现了可以生成chm的工具,于是乎我就研究了下,感觉还不错,所以也给大家分享下.好了,不多废话,下面就来实现一下吧. 生成前的准 ...
- 取消chrome浏览器下input和textarea的默认样式
最近一个细节引起了我的注意,chrome浏览器下的input和textarea在聚焦的时候都有一个黄色的边框,而且textarea还可以任意拖动放大,这是不能容忍的,影响美观不说,有时候拖动texta ...
- 自定义cell的步骤(每个cell的高度不一样,每个cell里面显示的内容也不一样)
1.新建一个继承自UITableViewCell的子类 2. 在initWithStyle:方法中进行子控件的初始化 1> 将有可能显示的所有子控件都添加到contentView中 2> ...
- 通过开源程序同时解决DNS劫持和DNS污染的问题
我们知道,某些网络运营商为了某些目的,对DNS进行了某些操作,导致使用ISP的正常上网设置无法通过域名取得正确的IP地址.常用的手段有:DNS劫持和DNS污染.关于DNS劫持和DNS污染的区别,请查找 ...
- 解决mysqldump: Got error: 1044: Access denied for user
转自:http://blog.slogra.com/post-512.html 今天给新加的几个数据库备份,在执行mysqldump的时候,居然报mysqldump: Got error: 1044: ...
- 用WP_Query自定义WordPress 主循环
我们知道操作 WordPress 主循环(WordPress Loop)最容易的方法是使用 query_posts 函数. 但是使用 query_posts 直接修改 WordPress 默认的主循环 ...
- table表头标题th浮动提示-MyTable.js
/* $(document).ready(function () { var maxH = ($(window).height() - $("#divParent").positi ...