基于lucene的分页有两种:
lucene3.5之前分页提供的方式为再查询方式(每次查询全部记录,然后取其中部分记录,这种方式用的最多),lucene官方的解释:由于我们的速度足够快。处理海量数据时,内存容易内存溢出。
lucene3.5以后提供一个searchAfter,这个是在特大数据量采用(亿级数据量),速度相对慢一点,像google搜索图片的时候,点击更多,然后再出来一批。这种方式就是把数据保存在缓存里面。然后再去取。
以下是再查询部分代码:
/** * 这就是先查询所有的数据,然后去分页数据 * 注意 这种方式处理海量数据的时候,容易内存溢出 * @param query * @param pageIndex--第几页 * @param pageSize--每页显示多少数据 */ public void searchPage(String query,int pageIndex,int pageSize) { try { Directory dir = FileIndexUtils.getDirectory(); IndexSearcher searcher = getSearcher(dir); QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35)); Query q = parser.parse(query); TopDocs tds = searcher.search(q, 500); //注意 此处把500条数据放在内存里。 ScoreDoc[] sds = tds.scoreDocs; int start = (pageIndex-1)*pageSize; int end = pageIndex*pageSize; for(int i=start;i<end;i++) { Document doc = searcher.doc(sds[i].doc); System.out.println(sds[i].doc+":"+doc.get("path")+"-->"+doc.get("filename")); } searcher.close(); } catch (org.apache.lucene.queryParser.ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
最后我们来看下使用SearcherAfter进行分页的方式,代码如下(lucene3.5之前 不支持该方法):
/** * 根据页码和分页大小获取上一次的最后一个scoredocs * @param pageIndex * @param pageSize * @param query * @param searcher * @return * @throws IOException */ private ScoreDoc getLastScoreDoc(int pageIndex,int pageSize,Query query,IndexSearcher searcher) throws IOException { if(pageIndex==1)return null;//如果是第一页就返回空 int num = pageSize*(pageIndex-1);//获取上一页的最后数量 TopDocs tds = searcher.search(query, num); return tds.scoreDocs[num-1]; } public void searchPageByAfter(String query,int pageIndex,int pageSize) { try { Directory dir = FileIndexUtils.getDirectory(); IndexSearcher searcher = getSearcher(dir); QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35)); Query q = parser.parse(query); //获取上一页的最后一个元素 ScoreDoc lastSd = getLastScoreDoc(pageIndex, pageSize, q, searcher); //通过最后一个元素去搜索下一页的元素 TopDocs tds = searcher.searchAfter(lastSd,q, pageSize); for(ScoreDoc sd:tds.scoreDocs) { Document doc = searcher.doc(sd.doc); System.out.println(sd.doc+":"+doc.get("path")+"-->"+doc.get("filename")); } searcher.close(); } catch (org.apache.lucene.queryParser.ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
面临海量数据分页时,一般搜索引擎不会有这种需求,百度默认支持76页数据。
相关推荐
在lucene搜索分页过程中,可以有两种方式 一种是将搜索结果集直接放到session中,但是假如结果集非常大,同时又存在大并发访问的时候,很可能造成服务器的内存不足,而使服务器宕机 还有一种是每次都重新进行搜索,这样...
Lucene支持两种类型的排序:基于评分(Score Sorting)和基于字段(Field Sorting)。基于评分的排序默认按照相关性排序,即每个文档与查询匹配的程度。而基于字段的排序则可以根据文档的特定字段值进行排序,如日期...
要开始使用Lucene进行文件检索,你需要指定两个关键目录:检索目录和索引目录。检索目录包含了需要被搜索的文件,而索引目录则用于存储生成的索引文件。通过调用提供的静态方法,可以快速完成索引的创建。这个过程...
3. **查询解析**:用户输入的搜索关键词会被解析成Lucene能够理解的查询语法,然后执行搜索操作。 4. **搜索排名**:Lucene使用TF-IDF算法等方法评估文档与查询的相关性,返回最相关的搜索结果。 5. **结果高亮**:...
### Lucene与Elasticsearch核心知识点详解 ...以上内容涵盖了Lucene和Elasticsearch中的关键知识点,从倒排索引的基本原理到具体的性能调优技巧,旨在帮助读者全面掌握这两款强大工具的核心技术和最佳实践。
"工具"标签则表明Lucene是一个用于开发的工具,它提供了一种方法来处理文本搜索问题。 **文件名称解析:** 1. **DemoData.java** - 这个文件很可能是包含测试数据或者示例数据的类,用于演示Lucene搜索功能。它...
主要包括以下两种类型: - **FSDirectory**: 用于指定硬盘上的目录来存储索引。 - **RAMDirectory**: 将索引存储在内存中,主要用于测试环境。 **1.1.3 Analyzer** `Analyzer` 负责将文本分析成一系列的 `Token`...
倒排索引是一种高效的数据结构,它允许快速定位包含特定术语的文档。 3. 分区与段:大型索引通常被分割成多个段,每个段是一个独立的、完整的索引,这样可以提高性能并简化并发更新。 三、Lucene查询处理 1. 查询...
通过综合运用Lucene和Heritrix这两款强大的工具,我们可以有效地构建一个高效、易用的高校图书搜索引擎。这一系统不仅能极大地提升图书资源的利用率,还能促进不同高校之间的资源共享与交流,为广大学子提供更加便捷...
在这个“lucene索引与搜索(含jar包)”中,我们有两个关键的 Java 文件——`Indexer.java` 和 `Searcher.java`,它们分别用于建立索引和执行搜索操作。 **1. Lucene 的工作原理** 在 Lucene 中,索引是一个预处理...
在本项目中,"ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现",我们将探讨如何利用这两种技术来创建一个高效且用户友好的搜索解决方案。 Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况...
- **分页**:对搜索结果进行分页显示,提高用户体验。 - **高亮显示**:对查询关键词在结果文档中的出现位置进行高亮,帮助用户更快定位相关信息。 - **相关性评分**:根据文档与查询的相关程度对结果进行排序。 ##...
在IT行业中,分页是一种常见的数据处理技术,特别是在Web应用中,用于展示大量数据时,以提高用户体验。这里我们关注的是“el”和“json”这两个关键词,它们分别代表了Elasticsearch和JSON(JavaScript Object ...
- 可以分为提取式和生成式两种方法。 - **5.6.2 自动摘要的设计** - 设计合理的自动摘要流程,包括文本预处理、摘要生成等步骤。 - 需要根据应用场景调整参数。 **5.7 自动分类** - **5.7.1 自动分类的接口...
在Lucene中,布尔搜索是一种重要的查询方式,它允许用户通过组合不同的搜索条件来表达复杂的查询逻辑。布尔查询基于布尔逻辑运算符,包括“AND”(所有条件都必须满足)、“OR”(满足任一条件即可)和“NOT”(排除...
在优化MySQL分页查询时,另一个关键点是减少扫描记录数,这可以通过以下两种方式实现: 1. 使用子查询:即先通过子查询获取到满足分页条件的最大ID,然后基于该ID值来限制主查询的扫描范围。 2. 使用JOIN操作:...
本文将详细介绍JEECMS V2012中的两种主要标签:`[@cms_tag_list]`、`[@cms_lucene_list]`以及`[@cms_lucene_page]`,帮助开发者更好地理解和运用这些标签,以实现高效的内容管理和展示。 ### 1. `[@cms_tag_list]` ...
2.1 使用jsp的两种模式 2.2 struts框架的实现 2.3 hibernate框架的实现 2.4 jpa框架的实现 2.5 spring框架的实现 2.6 jsf框架的实现 2.7 ajax框架的实现 2.8 使用jdbc连接数据库 2.9 小结...
Elasticsearch 提供了两种分页方式:`from`和`size`参数,以及`search_after`。 - **from+size**: `GET /my_index/_search?from=10&size=5` 返回第11到15个结果。 - **search_after**: 这种方法基于上一次搜索的...
- **工作执行**:包括同步和异步两种方式,根据应用需求选择合适的执行模式。 - **Reader 策略**:控制如何读取 Lucene 索引中的数据。 - **配置**:提供了丰富的配置选项,以适应不同的应用场景。 ##### 3.2 后端 ...