Elasticsearch的Groovy Script自定义评分检索
Posted 李军浩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch的Groovy Script自定义评分检索相关的知识,希望对你有一定的参考价值。
需求:以索引中的boostapp列作为评分的基础分值,同时根据carpublishtime(数据的刷新时间字段)按时间进行衰减。
基于Groovy脚本实现。
1、query脚本方式:
{ "fields": [ "boost", "ucarid", "boostapp", "carpublishtime" ], "query": { "function_score": { "query": { "match_all": {} }, "functions": [ { "script_score": { "script": "import java.util.Date;import java.text.DateFormat;import java.text.SimpleDateFormat;time2=((new Date().getTime()- new SimpleDateFormat(‘yyyy-MM-dd HH:mm:ss‘).parse(_source.carpublishtime.replace(‘T‘,‘ ‘)).getTime())/60000);if(time2<=60)_source.boostapp+time2/5 else if(time2<=120)_source.boostapp+(time2/10-6)*8 else if(time2<=180)_source.boostapp+(time2/10-12)*5 else _source.boostapp" } } ], "boost_mode": "replace", "score_mode": "sum" } }, "from": 0, "size": 10 }
2、Nest方式:
QueryContainer mainQuery = null; FunctionScoreQuery funcQuery = new FunctionScoreQuery(); funcQuery.ScoreMode = FunctionScoreMode.Sum; funcQuery.BoostMode = FunctionBoostMode.Replace; funcQuery.MaxBoost = 1000.0f; ScriptFilter scriptFilter = new ScriptFilter(); scriptFilter.Script = "import java.util.Date;import java.text.DateFormat;import java.text.SimpleDateFormat;time2=((new Date().getTime()- new SimpleDateFormat(‘yyyy-MM-dd HH:mm:ss‘).parse(_source.carpublishtime.replace(‘T‘,‘ ‘)).getTime())/60000);if(time2<=60)_source.boostapp+time2/5 else if(time2<=120)_source.boostapp+(time2/10-6)*8 else if(time2<=180)_source.boostapp+(time2/10-12)*5 else _source.boostapp"; funcQuery.ScriptScore = scriptFilter; mainQuery &= funcQuery;
以上是关于Elasticsearch的Groovy Script自定义评分检索的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Elasticsearch groovy script脚本更新数据
Elasticsearch 顶尖高手(19)—基于groovy脚本执行partial update
Elasticsearch 无法使用 lang groovy 运行内联脚本 [doc ....]