Elasticsearch 按照字段的长度过滤 (该字段必须为keyword 类型)附带api

ES查询中,有时候我们需要按照字段的长度过滤。以下为方法:

查询 name=tom且为sex=男的的员工,过滤resume个人简历描述大于50字长的

GET /user/_search
{
  "query": {
    "bool": {
      "must":[
      	   {"match":{"name":"tom"}},
           {"match":{"sex":"男"}}
       ],
       "filter": {
        "script" : {
            "script" :{
              "source" : "doc['resume'][0].length()>50",
              "lang"   :  "painless"
             }
          }
       }
     }
  }
}

版本2 多个参数的传递

GET /user/_search
{
  "query": {
    "bool": {
      "must":[
      	   {"match":{"name":"tom"}},
           {"match":{"sex":"男"}}
       ],
       "filter": {
        "script" : {
            "script" :{
              "params": { "markup": 50 },
              "source" : "doc['resume'][0].length()>params.markup",
              "lang"   :  "painless"
             }
          }
       }
     }
  }
}

java api操作

    @ResponseBody
    @RequestMapping("filterResume.json")
    public Map filterContext(ModelMap model, HttpServletRequest request, String begin, String end) {

        Map<String, Object> bucketsPathsMap = new HashMap<>();
        bucketsPathsMap.put("markup",50);
        String inlineScript = "doc['resume'][0].length()>params.markup";
        Script script = new Script(ScriptType.INLINE,"painless",inlineScript , bucketsPathsMap);

        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
                .must(QueryBuilders.termQuery("name","tom"))
                .must(QueryBuilders.termQuery("sex", "男"))
                .mustNot(QueryBuilders.termsQuery("address", "湖北","湖南"))
                .filter(QueryBuilders.scriptQuery(script));

        EstSql estSql = new EstSql(client).appendSubSql(boolQuery);
        estSql.setIndexName(Constants.USER);
        JSONObject result = JSONObject.parseObject(estSql.doSearch().toString());

        List<JSONObject> list = result.getJSONObject("hits").getJSONArray("hits")
                .stream().map(hit -> ((JSONObject) hit)
                .getJSONObject("_source"))
                .collect(Collectors.toList());
        return ResultMap.buildMapWithData(list);
    }

 

参数定义参见:https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-expression.html

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值