Elasticsearch 实现自定义排序插件

插件入口:

 

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();
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值