分页检索及完善站内搜索
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]);// titleString title = doc.get("article_title");// contentString 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>
?