Elasticsearch8常用查询api,java ElasticsearchClient写法和原生Rest DSL写法

0、前置条件

0.1、ES查询结果转换

    /**
     * 查询结果转换
     *
     * @param searchResponse 返回结果
     * @return List<Object>
     */
    public static List<Map<String, Object>> searchResponse2List(SearchResponse<ObjectNode> searchResponse) {

        if (searchResponse == null) {return new ArrayList<>(0);}
        if (searchResponse.hits() == null) {return new ArrayList<>(0);}
        if (CommonUtils.isCollectionEmpty(searchResponse.hits().hits())) {return new ArrayList<>(0);}

        List<Hit<ObjectNode>> hits = searchResponse.hits().hits();

        List<Map<String, Object>> list = new ArrayList<>(hits.size());
        for (Hit<ObjectNode> hit : hits) {
            ObjectNode node = hit.source();
            Map<String, Object> map = this.objectNode2Map(node);
            list.add(map);
        }
        return list;
    }

    /**
     * objectNode转Map
     *
     * @return Map<String, Object>
     */
    public static Map<String, Object> objectNode2Map(ObjectNode objectNode) {
        if (null == objectNode) {return new HashMap<>(0);}
        if (objectNode.isEmpty()) {return new HashMap<>(0);}
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.convertValue(objectNode, new TypeReference<Map<String, Object>>() {
        });
    }

0.3、查询请求

SearchRequest.Builder searchRequest = new SearchRequest.Builder();
searchRequest.query(q -> q.bool(b -> b.must(${query})));

SearchResponse<ObjectNode> response;
response = client.search(searchRequest.trackTotalHits(t->t.enabled(true)).build(), ObjectNode.class);

1、类型

1.1、 matchAll

Java Client

 searchRequest.query(q -> q.matchAll(m -> m));

Rest Api

{
 "query": {
  "match_all": {}
 }
}   

1.2、 match

Java Client

Query query =
        Query.of(q -> q.
                match(m -> m
                        .field(${field})
                        .query(FieldValue.of(${value}))
                )
        );

Rest Api

{
 "query": {
  "match": {
   "message": {
    "query": "this is a test"
   }
  }
 }
}

1.2、 terms 词查询,多个值

Java Client

List<FieldValue> terms = new ArrayList<>();
terms.add(FieldValue.of(${value1}));
terms.add(FieldValue.of(${value2}));

Query query =
        Query.of(q -> q.
                terms(t -> t
                        .field(${field})
                        .terms(tt -> tt.value(terms))
                )
        );

Rest Api

{
  "query": {
    "terms": {
      "${field}": [ "${value1}", "${value2}" ],
      "boost": 1.0
    }
  }
}

1.3、 range 范围

Java Client

Query query =
        Query.of(q -> q
                .range(r -> {
                            r.field(${field});
                            if (${true}) {
                                r.gte(${value1});
                            } else {
                                r.gt(${value1});
                            }
                            if (${true}) {
                                r.lte(${value2});
                            } else {
                                r.lt(${value2});
                            }
                            return r;
                        }
                )
        );

Rest Api

{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20,
        "boost": 2.0
      }
    }
  }
}

1.4、 wildcard 通配符

  • ?用来匹配任意字符,
  • *用来匹配零个或者多个字符。

Java Client

//?用来匹配任意字符,*用来匹配零个或者多个字符。
String value = condition.getValue().replace("_", "?");
value = value.replace("%", "*");

String finalValue = value;
Query query =
        Query.of(q -> q
                .wildcard(t -> t
                        .field(${field})
                        .value(${finalValue})
                )
        );

Rest Api

{
  "query": {
    "wildcard": {
      "${field}": {
        "value": "${value}",
        "boost": 1.0,
        "rewrite": "constant_score"
      }
    }
  }
}

1.5、 prefix 前缀

Java Client

Query query =
        Query.of(q -> q
                .prefix(t -> t
                        .field(${field})
                        .value(${value})
                )
        );

Rest Api

{
  "query": {
    "prefix": {
      "${field}": {
        "value": "${value}"
      }
    }
  }
}

1.6、 geo_distance 地理距离查询

Java Client

        Query query =
                Query.of(q -> q
                        .geoDistance(t -> t
                                .field(${field})
                                .location(l -> l
                                        .latlon(ll -> ll
                                                .lat(${lat})
                                                .lon(${lon})
                                        )
                                )
                                .distance(String.valueOf(${distance}))
                        )
                );
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "200km",
          "pin.location": {
            "lat": 40,
            "lon": -70
          }
        }
      }
    }
  }
}

1.5、 regexp 正则

Java Client

Query query =
        Query.of(q -> q
                .regexp(t -> t
                        .field(${field})
                        .value(${value})
                )
        );

Rest Api

{
  "query": {
    "regexp": {
      "user.id": {
        "value": "k.*y",
        "flags": "ALL",
        "case_insensitive": true,
        "max_determinized_states": 10000,
        "rewrite": "constant_score"
      }
    }
  }
}
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值