【ElasticSearch】脚本条件

翠微 / 2024-01-31 / 原文

REST API

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "sqStatus": {
              "value": 3,
              "boost": 1
            }
          }
        },
        {
          "script": {
            "script": {
              "source": "if (doc['finishTime'] == null) { false } else { doc['finishTime'].value.getMillis() > doc['timeLimit'].value.getMillis() }",
              "lang": "painless"
            },
            "boost": 1
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  }
}

Java Client

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.scriptQuery(new Script("if (doc['finishTime'] == null) { false } else { doc['finishTime'].value.getMillis() > doc['timeLimit'].value.getMillis() }")));
        {
          "script": {
            "script": {
              "lang": "painless",
              "source": 
              """
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                long fv = 0L;
                long sv = 0L;
                long rv = format.parse("2024-01-20 14:22:10").getTime();
                
                long f = (long) doc['flagTop'].value;
                long s = (long) doc['sortNo'].value;
                long r = doc['resourcePublicationDate'].value.toInstant().toEpochMilli();
                if (f > fv) { 
                  return true;
                } else if (f == fv) {
                  if (s > sv) {
                    return true;
                  } else if (s == sv) {
                    if (r >= rv) {
                      return true;
                    } else {
                      return false;
                    }
                  } else {
                    return false;
                  }
                } else {
                  return false;
                }
              """
            },
            "boost": 1
          }
        }