Elasticsearch 实现自定义排序插件
生活随笔
收集整理的這篇文章主要介紹了
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 {@Overridepublic String name() {return "comment-default-sort";}@Overridepublic 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 {@Overridepublic ExecutableScript newScript(@Nullable Map<String, Object> map) {return new CustomScript(map);}@Overridepublic boolean needsScores() {return false;}protected class CustomScript extends AbstractDoubleSearchScript {//params 通過外部傳入的參數方式進行排序干預public CustomScript(@Nullable Map<String,Object> params) {}@Overridepublic 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 实现自定义排序插件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Spark之创建RDD的两种方
- 下一篇: 让Elasticsearch飞起来:性能