Elasticsearch 實現自定義排序插件

插件入口:java

 

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();            }        }    }}
相關文章
相關標籤/搜索