最近想要修改調整一下ElasticSearch裏面Doc的Score,因而在ES官網查閱了一下,相關的介紹和說明仍是很是詳細的,能作的修改調整也仍是比較多的,須要根據具體的情形去選擇相應的方式作合適的調整修改,這裏作個簡單的記錄,以便後續使用方便。html
相關解釋描述能夠參考鏈接:dom
https://www.elastic.co/guide/cn/elasticsearch/guide/current/controlling-relevance.htmlelasticsearch
https://www.elastic.co/guide/cn/elasticsearch/guide/current/function-score-query.htmlide
https://www.elastic.co/guide/cn/elasticsearch/guide/current/boosting-by-popularity.html函數
https://www.elastic.co/guide/cn/elasticsearch/guide/current/function-score-filters.htmlui
https://www.elastic.co/guide/cn/elasticsearch/guide/current/random-scoring.htmlspa
https://www.elastic.co/guide/cn/elasticsearch/guide/current/decay-functions.htmlcode
https://www.elastic.co/guide/cn/elasticsearch/guide/current/script-score.htmlorm
如下是API操做的部分記錄:htm
ScoreFunctionBuilder scoreFunctionBuilder = ScoreFunctionBuilders.fieldValueFactorFunction(fieldName) .factor(boostFactor).modifier(modifier).missing(missing).setWeight(weight); 線性衰減函數 一旦直線與橫軸 0 相交,全部其餘值的評分都是 0.0 ScoreFunctionBuilders.linearDecayFunction(fieldName, origin, scale) .setDecay(decay).setOffset(offset).setWeight(weight) 指數衰減函數 先劇烈衰減而後變緩 ScoreFunctionBuilders.exponentialDecayFunction(fieldName, origin, scale) .setDecay(decay).setOffset(offset).setWeight(weight) 高斯衰減函數 高斯函數是鐘形的——它的衰減速率是先緩慢,而後變快,最後又放緩。 ScoreFunctionBuilders.gaussDecayFunction(fieldName, origin, scale) .setDecay(decay).setOffset(offset).setWeight(weight) origin 中心點或字段可能的最佳值,落在原點 origin上的文檔評分 _score 爲滿分 1.0 。 scale 衰減率,即一個文檔從原點 origin下落時,評分 _score改變的速度。 decay 從原點 origin衰減到 scale所得的評分 _score,默認值爲 0.5 。 offset 以原點 origin爲中心點,爲其設置一個非零的偏移量 offset覆蓋一個範圍,而不僅是單個原點。 在範圍 -offset <= origin <= +offset內的全部評分 _score 都是 1.0 。 隨機評分 ScoreFunctionBuilders.randomFunction(seed) 權重因素 ScoreFunctionBuilders.weightFactorFunction(weight)
腳本評分
String timeField = getTypeTimeField(type);
if (StringUtils.isBlank(timeField)) {
searchRequestBuilder.setQuery(buildBoolQuery(params.keywords(), attributes));
} else {
String inlineScript = ElasticScriptUtils.scriptWithScoreAndTime(timeField, System.currentTimeMillis());
Map<String, Object> sparams = new HashMap<>();
Script script = new Script(inlineScript, ScriptType.INLINE, "groovy", sparams);
ScoreFunctionBuilder scoreFunctionBuilder = ScoreFunctionBuilders.scriptFunction(script);
searchRequestBuilder.setQuery(QueryBuilders.functionScoreQuery(
buildBoolQuery(params.keywords(), attributes), scoreFunctionBuilder));
}
public class ElasticScriptUtils {
public static String scriptWithScoreAndTimeV1(String field, long currentTime) {
String script = ""
+ "field = (null==_source." + field + "?\"1970-01-01 12:00:00\":source." + field + ");"
+ "format = \"\";"
+ "ds = field.trim().split(\":\");"
+ "if (ds.length == 3) {"
+ " format = \"yyyy-MM-dd HH:mm:ss\";"
+ "} else if (ds.length == 2) {"
+ " format = \"yyyy-MM-dd HH:mm\";"
+ "} else if (ds.length == 1) {"
+ " ds = d.trim().split(\" \");"
+ " if (ds.length == 2) {"
+ " format = \"yyyy-MM-dd HH\";"
+ " } else if (ds.length == 1) {"
+ " ds = d.trim().split(\"-\");"
+ " if (ds.length == 3) {"
+ " format = \"yyyy-MM-dd\";"
+ " } else if (ds.length == 2) {"
+ " format = \"yyyy-MM\";"
+ " } else if (ds.length == 1) {"
+ " format = \"yyyy\";"
+ " }"
+ " }"
+ "};"
+ "parse_date = Date.parse(format, field).getTime();"
+ "return _score.doubleValue() + (parse_date / " + currentTime + ");";
return script;
}
public static String scriptWithScoreAndTime(String fields, long currentTime) {
String script = ""
+ "temp_fields = \"" + fields + "\".trim().split(\",\");"
+ "target_field = temp_fields[0];"
+ "temp_field = _source.target_field;"
+ "for (i in 2.. temp_fields.length) {"
+ " if (null != temp_field) break;"
+ " target_field = temp_fields[i-1];"
+ " temp_field = _source.target_field;"
+ "};"
+ "field = (null==temp_field ? \"1970-01-01 12:00:00\" : temp_field);"
+ "format = \"\";"
+ "ds = field.trim().split(\":\");"
+ "if (ds.length == 3) {"
+ " format = \"yyyy-MM-dd HH:mm:ss\";"
+ "} else if (ds.length == 2) {"
+ " format = \"yyyy-MM-dd HH:mm\";"
+ "} else if (ds.length == 1) {"
+ " ds = d.trim().split(\" \");"
+ " if (ds.length == 2) {"
+ " format = \"yyyy-MM-dd HH\";"
+ " } else if (ds.length == 1) {"
+ " ds = d.trim().split(\"-\");"
+ " if (ds.length == 3) {"
+ " format = \"yyyy-MM-dd\";"
+ " } else if (ds.length == 2) {"
+ " format = \"yyyy-MM\";"
+ " } else if (ds.length == 1) {"
+ " format = \"yyyy\";"
+ " }"
+ " }"
+ "};"
+ "parse_date = Date.parse(format, field).getTime();"
/**
+ "println _score.doubleValue(); println (parse_date / " + currentTime + ");"
**/
+ "return _score.doubleValue() + (parse_date / " + currentTime + ");";
return script;
}
https://www.elastic.co/guide/cn/elasticsearch/guide/current/decay-functions.html