插件入口:

package ttd.ugc.plugin;

import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.script.ScriptModule; /**
* Created by jin_h on 2017/1/9.
*/
public class NativeScriptPlugin extends Plugin {
@Override
public String name() {
return "comment-default-sort";
} @Override
public String description() {
return "comment-default-sort";
} public void onModule(ScriptModule module) {
//comment-default-sort排序算法的名称
module.registerScript("comment-default-sort", CommentDefaultSortScriptFactory.class);
}
} 插件具体实现:
package ttd.ugc.plugin;

import org.elasticsearch.common.Nullable;
import org.elasticsearch.index.fielddata.ScriptDocValues;
import org.elasticsearch.script.AbstractDoubleSearchScript;
import org.elasticsearch.script.AbstractLongSearchScript;
import org.elasticsearch.script.ExecutableScript;
import org.elasticsearch.script.NativeScriptFactory;
import org.elasticsearch.search.lookup.LeafDocLookup; import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; /**
* Created by jin_h on 2017/1/9.
*/
public class CommentDefaultSortScriptFactory implements NativeScriptFactory {
@Override
public ExecutableScript newScript(@Nullable Map<String, Object> map) {
return new CustomScript(map);
} @Override
public boolean needsScores() {
return false;
} protected class CustomScript extends AbstractDoubleSearchScript { //params 通过外部传入的参数方式进行排序干预
public CustomScript(@Nullable Map<String,Object> params) { } @Override
public double runAsDouble() {
//三种获取文档方式.
//((ScriptDocValues.Longs)doc().get("wordnumber")).getValue()
//(int)source().get("wordnumber");
//this.docFieldLongs("wordnumber");
double wordNumber;
double commentTime;
double useDate;
double numPicture;
double feedBack;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String today = sdf.format(new Date());
if (source().get("wordnumber") == null) {
wordNumber = 0;
} else {
wordNumber = (int)source().get("wordnumber");
if (wordNumber >= 100) {
wordNumber = 1;
} else if (wordNumber >= 70) {
wordNumber = 0.9;
} else if (wordNumber >= 60) {
wordNumber = 0.8;
} else if (wordNumber >= 50) {
wordNumber = 0.7;
} else if (wordNumber >= 40) {
wordNumber = 0.6;
} else if (wordNumber >= 30) {
wordNumber = 0.5;
} else if (wordNumber >= 20) {
wordNumber = 0.4;
} else if (wordNumber >= 10) {
wordNumber = 0.3;
} else if (wordNumber >= 5) {
wordNumber = 0.2;
} else if (wordNumber >= 1) {
wordNumber = 0.1;
} else {
wordNumber = 0;
}
}
if (source().get("imgcount") == null) {
numPicture = 0;
} else {
numPicture = (int)source().get("imgcount");
if (numPicture >= 10) {
numPicture = 1;
} else if (numPicture >= 9) {
numPicture = 0.9;
} else if (numPicture >= 8) {
numPicture = 0.8;
} else if (numPicture >= 7) {
numPicture = 0.7;
} else if (numPicture >= 6) {
numPicture = 0.6;
} else if (numPicture >= 5) {
numPicture = 0.5;
} else if (numPicture >= 4) {
numPicture = 0.4;
} else if (numPicture >= 3) {
numPicture = 0.3;
} else if (numPicture >= 2) {
numPicture = 0.2;
} else if (numPicture >= 1) {
numPicture = 0.1;
} else {
numPicture = 0;
}
}
if (source().get("useful") == null) {
feedBack = 0;
} else {
feedBack = (int)source().get("useful");
if (feedBack >= 10) {
feedBack = 1;
} else if (feedBack >= 9) {
feedBack = 0.9;
} else if (feedBack >= 8) {
feedBack = 0.8;
} else if (feedBack >= 7) {
feedBack = 0.7;
} else if (feedBack >= 6) {
feedBack = 0.6;
} else if (feedBack >= 5) {
feedBack = 0.5;
} else if (feedBack >= 4) {
feedBack = 0.4;
} else if (feedBack >= 3) {
feedBack = 0.3;
} else if (feedBack >= 2) {
feedBack = 0.2;
} else if (feedBack >= 1) {
feedBack = 0.1;
} else {
feedBack = 0;
}
}
commentTime =source().get("cmtdate")==null?-1:(sdf.parse(today).getTime() - sdf.parse(source().get("cmtdate").toString()).getTime())/(24*60*60*1000);
if (commentTime >= 620) {
commentTime = 0.1;
} else if (commentTime >= 360) {
commentTime = 0.2;
} else if (commentTime >= 180) {
commentTime = 0.3;
} else if (commentTime >= 120) {
commentTime = 0.4;
} else if (commentTime >= 90) {
commentTime = 0.5;
} else if (commentTime >= 60) {
commentTime = 0.6;
} else if (commentTime >= 30) {
commentTime = 0.7;
} else if (commentTime >= 14) {
commentTime = 0.8;
} else if (commentTime >= 7) {
commentTime = 0.9;
} else if (commentTime >= 0) {
commentTime = 1;
} else {
commentTime = 0;
}
useDate =source().get("usedate")==null?-1: (sdf.parse(today).getTime() - sdf.parse(source().get("usedate").toString()).getTime())/(24*60*60*1000);
if (useDate >= 620) {
useDate = 0.1;
} else if (useDate >= 360) {
useDate = 0.2;
} else if (useDate >= 180) {
useDate = 0.3;
} else if (useDate >= 120) {
useDate = 0.4;
} else if (useDate >= 90) {
useDate = 0.5;
} else if (useDate >= 60) {
useDate = 0.6;
} else if (useDate >= 30) {
useDate = 0.7;
} else if (useDate >= 14) {
useDate = 0.8;
} else if (useDate >= 7) {
useDate = 0.9;
} else if (useDate >= 0) {
useDate = 1;
} else {
useDate = 0;
}
double iw_wordNumber = 0.3;
double iw2_commentTime = 0.2;
double iw3_useDate = 0.2;
double iw4_numPicture = 0.15;
double iw5_feedBack = 0.15;
double sumW = iw_wordNumber + iw2_commentTime + iw3_useDate + iw4_numPicture + iw5_feedBack;
double sumScore = wordNumber * iw_wordNumber + commentTime * iw2_commentTime + useDate * iw3_useDate + numPicture * iw4_numPicture + feedBack * iw5_feedBack;
return (sumScore / sumW);
}catch (Exception ex){
ex.printStackTrace();
return -1;//this.docFieldLongs("wordnumber").getValue();
}
}
}
}

Elasticsearch 实现自定义排序插件的更多相关文章

  1. 表格排序插件datatables

    之前用过表格排序插件tinytables,用到后面,随着需求的更改,发现这个插件真的low到爆了,不适合用于多表格,只有一个表格的页面可以凑合着用,有很多局限性. 之后发现了一款表格排序插件datat ...

  2. datatables对于某一特定的列进行自定义排序

    首先说下里边的api,其中第一个是order,这个里边是设置哪些排序哪些不排序的,比如:$('#example').dataTable( {     "order": (funct ...

  3. 手把手带你自定义 Gradle 插件 —— Gradle 系列(2)

    请点赞加关注,你的支持对我非常重要,满足下我的虚荣心. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友 ...

  4. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  5. DataTable自定义排序

    使用JQ DataTable 的时候,希望某列数据可以进行自定义排序,操作如下:(以中文排序和百分比排序为例) 1:定义排序类型: //百分率排序 jQuery.fn.dataTableExt.oSo ...

  6. MixItUp:超炫!基于 CSS3 & jQuery 的过滤和排序插件

    MixItUp 是一款轻量,但功能强大的 jQuery 插件,提供了对分类和有序内容的美丽的动画过滤和排序功能.特别适合用于作品集网站,画廊,图片博客以及任何的分类或有序内容. 它是如何工作的? Mi ...

  7. Sortable – 简单灵活的 JavaScript 拖放排序插件

    当需要在网站中添加拖放排序功能的时候,jQuery UI 的排序组件可能是最流行的解决方案.今天给大家介绍另一款简单灵活的 JavaScript 拖放排序插件——Sortable,它使用 HTML5 ...

  8. 干货之UICollectionViewFlowLayout自定义排序和拖拽手势

    使用UICollectionView,需要使用UICollectionViewLayout控制UICollectionViewCell布局,虽然UICollectionViewLayout提供了高度自 ...

  9. DataGridView 绑定List集合后实现自定义排序

    这里只贴主要代码,dataList是已添加数据的全局变量,绑定数据源 datagridview1.DataSource = dataList,以下是核心代码. 实现点击列表头实现自定义排序 priva ...

随机推荐

  1. A*算法改进——Any-Angle Path Planning的Theta*算法与Lazy Theta*算法

    本文是该篇文章的归纳http://aigamedev.com/open/tutorial/lazy-theta-star/#Nash:07 . 传统的A*算法中,寻找出来的路径只能是沿着给出的模型(比 ...

  2. CSS text系列

    text-shadow 语法规则: h-shadow(必需,水平阴影的位置,可负): v-shadow(必需,垂直阴影的位置,可负): blur(可选,模糊距离): color(可选,阴影的颜色). ...

  3. mybatis多对多关联查询——(十)

    1.需求 查询用户及用户购买商品信息. 2     sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表: orders.orderdetail. ...

  4. shell函数中eof报错(warning: here-document at line 9 delimited by end-of-file (wanted `EOF'))

    在shell编写函数时,函数中有eof和EOF,如果是在sublime编写按照格式tab缩进会有以下报错 解决办法: 取消函数中的tab缩进,在运行即可

  5. IE浏览器如何调试Asp.net的 js代码

    不管我们开发什么项目,都需要使用调试.后端的调试比较简单.前端js调试稍微复杂了一点,但是也别怕,因为我们有很多调试前端js代码的浏览器工具.比如IE浏览器.firefox浏览器.chrome浏览器等 ...

  6. NEERC Southern Subregional 2011

    NEERC Southern Subregional 2011 A - Bonnie and Clyde solution 双指针搞搞就好. 时间复杂度:\(O(n)\) B - Building F ...

  7. APMServ5.2.6win10系统Apache、MySQL5.1启动失败解决办法

    今天想在本地测试网站源码能否正常运行,如果可以就转空间了,然而下载了APMServ之后发现系统Apache.MySQL5.1启动均失败,小白的人表示只能借助百度,用了一个小时的时间终于解决了,虽然坎坷 ...

  8. 一个洛谷Material化的Stylish美化主题

    Luogu Argon Design 新主题 Luogu Argon Design 目前已经取代了 Luogu Material,但这并不代表 Luogu Material 会停止更新,在 Luogu ...

  9. java安装1.8的经验和Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVers问题处理

            java安装1.8后的问题:之前安装了jdk1.7和jdk1.6,之后又安装jdk1.8,然后执行java -version,输出的是1.8的,后来在注册表把jdk1.8改为1.7,然 ...

  10. 为什么因式分解n=pq分别得到pq是求解密钥中d的关键

    从d的来源来说,它是这样来的: "找到一个数d,使得ed-1能够被z整除.即给定e,选择数d,使得ed被z除的余数为1",即  ed=1 (mod z) 上面这句话中,为了求d,我 ...