jeecms搜索结果排序-二次开发
jeecms搜索用的是apache Lucene,要实现此功能得先去学习它。
直接上代码
package com.jeecms.cms.lucene; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date; import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.FieldCache;
import org.apache.lucene.search.FieldComparator;
import org.apache.lucene.search.FieldComparatorSource; public class LuceneContentComparatorSource extends FieldComparatorSource { private int lmId = 0;
public LuceneContentComparatorSource() {
}
public LuceneContentComparatorSource(int lmId) {
this.lmId = lmId;
}
@Override
public FieldComparator newComparator(String field, int allCounts, int newCount,
boolean reversed) throws IOException {
return new LuceneContentComparatorSource.LuceneContentFieldComparator(allCounts, field);
}
class LuceneContentFieldComparator extends FieldComparator{
private String[] values;
private String[] currentReaderValues;
private final String field;
private String bottom;
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
public LuceneContentFieldComparator(int numHits, String field) {
this.values = new String[numHits];
this.field = field;
}
@Override
public int compare(int slot1, int slot2) {
try {
if("releaseDate".equals(field)){
Date val1 = format.parse(this.values[slot1]);
Date val2 = format.parse(this.values[slot2]);
if(null == val1) {
if(null == val2) {
return 0;
}
return -1;
}
if(null == val2) {
return 1;
} if(val1.after(val2)) {
return 1;
}
if(val2.after(val1)) {
return -1;
}
}else if("channelIdArray".equals(field)){
if(this.values[slot1].equals(this.values[slot2])){
return 0;
}else if((lmId + "").equals(this.values[slot1])){
return 1;
}else if((lmId + "").equals(this.values[slot2])){
return -1;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
@Override
public int compareBottom(int doc) throws IOException {
try {
if("releaseDate".equals(field)){
Date val2 = format.parse(this.currentReaderValues[doc]);
Date tempBottom = format.parse(this.bottom);
if (tempBottom == null) {
if (val2 == null) {
return 0;
}
return -1;
}
if (val2 == null) {
return 1;
}
if(val2.after(tempBottom)) {
return 1;
}
if(tempBottom.after(val2)) {
return -1;
}
}else if("channelIdArray".equals(field)){
if(this.bottom.equals(this.currentReaderValues[doc])){
return 0;
}else if((lmId + "").equals(this.bottom)){
return 1;
}else if((lmId + "").equals(this.currentReaderValues[doc])){
return -1;
}
}
} catch(Exception e) {
e.printStackTrace();
}
return 0;
}
@Override
public void copy(int slot, int doc) throws IOException {
this.values[slot] = this.currentReaderValues[doc]; }
@Override
public void setBottom(int bottom) {
this.bottom = this.values[bottom];
}
@Override
public void setNextReader(IndexReader reader, int arg1)
throws IOException {
this.currentReaderValues = FieldCache.DEFAULT.getStrings(reader, this.field);
}
@Override
public Comparable value(int slot) {
return this.values[slot];
} } }
我的需求是需呀根据栏目ID 与日期排序 所以以上代码就如此写的
至此 基本已经完成,之后只需要在 search方法中 传入 sort对象即可
//栏目排序类
SortField sortFieldLm = new SortField("channelIdArray", new LuceneContentComparatorSource(lmId), true);
//日期排序
SortField sortFieldDate = new SortField("releaseDate", new LuceneContentComparatorSource(), true);
Sort sort = new Sort ();
sort.setSort(sortFieldLm,sortFieldDate);
//排序类
TopDocs docs = searcher.search(query,null, pageNo * pageSize,sort);
jeecms搜索结果排序-二次开发的更多相关文章
- 原 JEECMS导入IDEA进行二次开发图文教程
JEECMS导入IDEA进行二次开发图文教程 2017年05月15日 17:03:53 Swain_Ho 阅读数 3257 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...
- 【Yom框架】漫谈个人框架的设计之二:新的IRepository接口+搜索和排序解耦(+基于Castle实现)
经过了上篇IRepository和IRepository<T>的讨论[文章地址为:http://www.cnblogs.com/yomho/p/3296759.html] 我选择了IRep ...
- jeecms系统使用介绍——通过二次开发实现对word、pdf、txt等上传附件的全文检索
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/76912307 本文出自[我是干勾鱼的博客] 之前在文章<基于Java的门户 ...
- 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单、书签等相关问题
2015-03-02 更新文章,由于需求修改,更改了flexpaper插件,故增加第9.10.11小节,下载代码时请注意. 先废话几句.最近用到文档在线浏览功能,之前用的是print2flash(一个 ...
- FlexPaper二次开发问题及搜索高亮显示
原文:FlexPaper二次开发问题及搜索高亮显示 最近有个需求,做一个IT知识库,类似于文库,说到文库肯定会用到在线浏览文档了,所有在网上翻阅了一下类似豆丁的在线浏览器插件的资料,将其进行了二次开发 ...
- 【IOS开发】搜索和排序(好友列表,通讯录的实现,searchbar)
一.效果图: 二.概述 实现一个好友列表,可以分为男女两个选项,并且实现搜索和排序功能.我的数据是放在plist文件中. 三.代码简述 代码结构如图,首先自定义一个Cell. cell.h #impo ...
- Java实现 LeetCode 81 搜索旋转排序数组 II(二)
81. 搜索旋转排序数组 II 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判 ...
- #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案
郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...
- Android VLC播放器二次开发1——程序结构分析
最近因为一个新项目需要一个多媒体播放器,所以需要做个视频.音频.图片方面的播放器.也查阅了不少这方面的资料,如果要从头做一个播放器工作量太大了,而且难度也很大.所以最后选择了VLC作为基础,进行二次开 ...
随机推荐
- MySQL注入工具sqlsus
MySQL注入工具sqlsus sqlsus是使用Perl语言编写的MySQL注入和接管工具.它可以获取数据库结构,实施注入查询,下载服务器的文件,爬取可写目录并写入后门,以及复制数据库文件等功能 ...
- Linux下防止文件误删方法
转载:http://coolsky.blog.51cto.com/177347/1230332 Linux系统中,在root帐号下使用rm * -rf是非常危险的,一不小心就可能删除系统中的重要文件. ...
- easyui 放大镜图标
iconCls:search 对应的 easyui的查询图标忒丑 想用放大镜图标 iconCls:zoom 找半天找到放大镜图标的 然后去icon.css文件中查 发现这个样式就叫zoom.
- [置顶]
kubernetes创建资源yaml文件例子--pod
kubernetes创建pod的yaml文件,参数说明 apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 ...
- hibernate的 lazy 和 fetch 一般配置
fetch 和 lazy 配置用于数据的查询 lazy 参数值常见有 false 和 true,Hibernate3 映射文件中默认lazy = true : fetch 指定了关联对象抓取的方式,参 ...
- 报错kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 26s
近期在服务器跑大量高负载程序,造成cpu soft lockup.如果确认不是软件的问题. 解决办法: #追加到配置文件中 echo 30 > /proc/sys/kernel/watchdog ...
- Android源码解析系列
转载请标明出处:一片枫叶的专栏 知乎上看了一篇非常不错的博文:有没有必要阅读Android源码 看完之后痛定思过,平时所学往往是知其然然不知其所以然,所以为了更好的深入Android体系,决定学习an ...
- oracle调优 浅析“会话管理开销”
调优之浅析"会话管理开销" [简单介绍] 在调优的过程中,对于会话的管理是比較普遍的问题,由于维护会话的开销相对是比較高的. [过程表现例如以下] ...
- solrCloud分布式检索流程
FROM: http://blog.csdn.net/duck_genuine/article/details/17014991 好久没写solr的文章了,刚好需要在公司作个分享,先总结一些先. 引用 ...
- MySQL5.7 基于二进制包的安装
1.MySQL5.7安装注意事项 1.在MySQL5.7中mysql_install_db已经不再推荐使用,建议改成mysqld-initialize 完成实力初始化.(mysql_install_d ...