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 ....]

Elasticsearch自定义过滤插件实现复杂逻辑过滤

(37)ElasticSearch基于groovy脚本执行partial update

elasticsearch系列java定义score