Elasticsearch 實現自定義排序插件(轉載)

轉自:http://www.cnblogs.com/xffy1028/p/6383676.html


插件入口:

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 map) {

return new CustomScript(map);

}

@Override

public boolean needsScores() {

return false;

}

protected class CustomScript extends AbstractDoubleSearchScript {

//params 通過外部傳入的參數方式進行排序干預

public CustomScript(@Nullable Map 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();

}

}

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139