public static final int pageSize = 5; //每页显示多少条记录
private int pageNum;//当前页码
private int totalPageSize;//总页数
/**
* 通过关键词 得到结果
*/
public void searchIndex(String path, String keywords) throws Exception {
long startTime = new Date().getTime();
FSDirectory directory = FSDirectory.open(new File(path));
IndexReader reader = IndexReader.open(directory);
Searcher searcher = new IndexSearcher(directory);
// MultiFieldQueryParser.parse中的参数分别为:
// 1.关键词
// 2.要查询的字段,字符串类型的数组
String[] field = { "article_title", "article_content" };
// 3.两个字段的关系(与或非)
BooleanClause.Occur[] flags = new BooleanClause.Occur[] {
BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD };
// 4.指明分词的时候所用的分词器
Analyzer analyzer = new IKAnalyzer();
// Query query = MultiFieldQueryParser.parse(keywords, field, flags,
// analyzer);
Query query = MultiFieldQueryParser.parse(Version.LUCENE_30, keywords,
field, flags, analyzer);
// 由于我们目前使用的查询是多字段查询,需要匹配度的排序
// QueryScorer内置计分器
query.rewrite(reader);// 用于重写query对象,目的能够让计分器识别当前的query.
// 获得结果集
// Hits hits = searcher.search(query);
TopFieldCollector tc = TopFieldCollector.create(Sort.INDEXORDER, 20000, false, false, false, false);
//TopDocs hits = searcher.search(query,20000);
searcher.search(query, tc);
if(pageNum > 0 ){
pageNum -= 1;
}
TopDocs hits = tc.topDocs(pageNum * pageSize);
this.maxResultSize = String.valueOf(tc.getTotalHits());
if(tc.getTotalHits()%this.pageSize == 0){
this.totalPageSize = tc.getTotalHits()/this.pageSize;
}else{
this.totalPageSize = tc.getTotalHits()/this.pageSize + 1;
}
for (int i = 0; i < hits.scoreDocs.length&&i < this.pageSize ; i++) {
ScoreDoc sdoc = hits.scoreDocs[i];
Document doc = searcher.doc(sdoc.doc);
Article article = new Article();
article.setId(Integer.valueOf(doc.get("id")));
article.setIsCreate(String.valueOf(doc.get("isCreate")).toCharArray()[0]);
// title
String title = doc.get("article_title");
// content
String content = doc.get("article_content");
// 以上两项需要加亮
// Highlighter的构造函数中需要添加两个参数
// 1.高亮文字的格式(这个格式是基于html)
SimpleHTMLFormatter simpleHTMLFOrmatter = new SimpleHTMLFormatter(
"<font color=red>", "</font>");
// 2.计分器
Highlighter highlighter = new Highlighter(simpleHTMLFOrmatter,
new QueryScorer(query));
// 关键字附近字符串的截取,截取120个字
Fragmenter fragmenter = new SimpleFragmenter(120);
highlighter.setTextFragmenter(fragmenter);
// 针对某个字段的加亮以及截取
TokenStream tokenStream = analyzer.tokenStream("article_content",
new StringReader(content));
// 将加亮并截取的字符串取出来
String highLightText = highlighter.getBestFragment(tokenStream,
content);
article.setArticleContent(highLightText);
// 针对某个字段的加亮以及截取
TokenStream title_tokenStream = analyzer.tokenStream(
"article_title", new StringReader(title));
// 将加亮并截取的字符串取出来
String title_highLightText = highlighter.getBestFragment(
title_tokenStream, title);
article.setArticleTitle(title_highLightText);
searcheResult.add(article);
}
reader.close();
}
<s:bean name="org.apache.struts2.util.Counter" id="counter">
<s:param name="first" value="1"/>
<s:param name="last" value="#request.totalPageSize"/>
<s:iterator>
<span style="cursor:pointer;color:blue;" onclick="submitForm('${current - 1}')"><u>[${current - 1}]</u></span>
</s:iterator>
</s:bean>
给 标题和正文加连接
<s:iterator value="#request.searcheResult" id="article">
<a href="${article.id}_${article.isCreate}.html" target="_blank">${article.articleTitle}</a><br/>
${article.articleContent}...
<br/><br/><br/>
</s:iterator>
分享到:
相关推荐
java连接elasticsearch实现全文检索,并且高亮显示结果,实现分页。项目基于elasticsearch5.6.1可根据自己实际情况调整版本。最近项目需要所以学习了一下,项目很简单可以根据你的实际情况更改接口。我本地的搜索是...
本篇文章将带你迈出使用Lucene的第一步,重点关注如何实现分页检索,这对于构建高效、用户友好的搜索系统至关重要。 Lucene的核心功能包括文档索引、查询解析和结果排序。在分页检索方面,我们需要考虑如何有效地...
总的来说,这些技术组合在一起,可以构建一个功能完善的Web应用,包括高效的数据分页、严格的敏感词过滤、便捷的数据导入导出以及安全的用户权限管理。理解并掌握这些技术,对于提升Web应用的用户体验和安全性至关...
总的来说,Lucene.Net为C#开发者提供了强大的站内搜索工具,通过理解和掌握其工作原理及API,可以构建出满足各种需求的高效搜索系统。在实践中,不断迭代和完善,才能真正发挥其潜力,为用户提供出色的搜索体验。
在搜索引擎技术中,Apache Lucene 是一个非常重要的开源全文检索库。它提供了高效、可扩展的搜索功能,被广泛应用于各种项目中。本压缩包中的代码着重展示了如何使用 Lucene 进行分页搜索和结果高亮显示。下面将详细...
在现代Web开发中,构建一个高效、功能完善的文档搜索系统是至关重要的。本项目基于SpringMVC、MyBatis和Lucene4技术栈,实现了这样一个系统,特别强调了对文档的分页查询功能,以提供流畅的用户体验。 **SpringMVC...
通过以上步骤,我们可以构建一个功能完善的站内搜索引擎。实际应用中,还需要考虑搜索引擎的扩展性和维护性,以及如何处理动态更新的数据。同时,对用户行为的分析和个性化搜索也是未来搜索引擎发展的重要方向。
【ASP.NET源码——[搜索链接]文献检索系统】是一个基于ASP.NET技术开发的文献检索系统,主要用于帮助用户快速、高效地查找相关的学术文献或资料。这个系统充分展示了ASP.NET框架在构建Web应用程序上的强大功能,尤其...
总的来说,formcurd是Django开发者的一个强大助手,它通过提供全面的搜索、排序、批量操作和分页功能,以及丰富的自定义选项,使得快速构建功能完善的后台管理系统成为可能。对于任何需要处理数据密集型任务的Django...
这个压缩包包含了实现这一功能所需的全部代码资源,适合用于构建具有分页、搜索和排序功能的统计表格。 首先,让我们深入了解一下jQuery如何实现动态表格的功能。在网页上,动态表格通常用于展示大量数据,通过分页...
本项目旨在构建一个基于ASP技术的局域网文件共享及检索系统,该系统能够有效地管理和共享局域网内的文件资源,并提供高效、准确的文件检索功能。项目的实现不仅涉及到ASP编程技术的应用,还包含了数据库设计、用户...
搜索引擎界面可能包含搜索框、筛选选项、分页和高亮显示搜索结果等功能。 8. **性能优化**:对于大型网站,搜索引擎需要考虑性能和可扩展性。可能包含了缓存策略、负载均衡和数据库优化等技术。 9. **安全性**:...
本文将深入探讨如何在微信小程序中创建一个高效、美观且功能完善的搜索框,以满足用户对信息快速检索的需求。 首先,我们需要理解微信小程序的基础架构。微信小程序基于WXML(WeChat Markup Language)和WXSS...
1. **指定站点的站内查询**:用户可以直接在特定网站内进行文件搜索。 2. **结果排序**:根据时间、大小、来源站点等不同维度对搜索结果进行排序。 3. **二次查询**:在初次搜索结果的基础上进行再次查询,缩小搜索...
织梦CMS,全称DedeCMS,是一款基于...总之,理解和熟练运用织梦CMS的SQL标签及模糊查询、分页功能,能极大地提高网站数据管理的灵活性和用户体验。正确使用附带文档,遵循安全最佳实践,将使你的网站更强大、更安全。
在实际项目中,我们还需要考虑一些额外的细节,比如搜索历史的清理、数据安全(加密存储)、以及搜索记录的分页显示等。此外,为了符合Android的设计规范,应确保界面的可访问性和易用性,如适配不同的屏幕尺寸,...
2. **完善课程发布功能**: 在课程发布过程中自动将元数据推送到 Elasticsearch 索引,以便于后续的搜索操作。 3. **使用Logstash完成课程索引**: Logstash 是 ELK (Elasticsearch, Logstash, Kibana) 堆栈的一部分...
2. 卡片式加载:如果城市列表非常庞大,可以采用分页加载策略,只加载可视范围内的数据,提高性能。 五、用户体验 1. 键盘监听:监听键盘的返回事件,用户停止输入时,可以自动取消高亮状态或关闭搜索结果。 2. ...
在此项目中,开发者利用ASP(Active Server Pages)技术构建了一个功能完善的搜索引擎,能够帮助用户在互联网上快速、准确地找到所需的信息。下面将详细解析这个项目的相关知识点。 一、ASP技术 ASP是微软开发的一...
在这个项目例子中,我们将深入探讨如何利用Lucene进行索引构建、查询处理以及结果排序,从而创建一个功能完善的搜索引擎。 首先,我们需要了解Lucene的基本概念。Lucene的核心功能包括文本分析、索引构建和搜索。...