分享

架构师必备:多维度查询的最佳实践

 SNSJXQ 2022-06-01 发布于江苏
public class EsClientDemo { // demo演示:创建client,然后搜索 public void createClientAndSearch() throws Exception { // 创建底层的low level rest client,连接ES节点的9200端口 RestClient restClient = RestClient.builder( new HttpHost('localhost', 9200)).build(); // 创建transport类,传入底层的low level rest client,和json解析器 ElasticsearchTransport transport = new RestClientTransport( restClient, new JacksonJsonpMapper()); // 创建核心client类,后续操作都围绕此对象 ElasticsearchClient esClient = new ElasticsearchClient(transport); // 多条件搜索 // fluent API风格,并且使用lambda函数提高代码可读性,可以看出Java api client的语法,同http json请求体非常相似 String searchText = 'bike'; String brand = 'brandNew'; double maxPrice = 1000; // 根据商品名称,做match全文检索查询 Query byName = MatchQuery.of(m -> m .field('name') .query(searchText) )._toQuery(); // 根据品牌,做term精确查询 Query byBrand = new Query.Builder() .term(t -> t .field('brand') .value(v -> v.stringValue(brand)) ).build(); // 根据价格,做range范围查询 Query byMaxPrice = RangeQuery.of(r -> r .field('price') .lte(JsonData.of(maxPrice)) )._toQuery(); // 调用核心client,做查询 SearchResponse<Product> response = esClient.search(s -> s .index('products') // 指定ES索引 .query(q -> q // 指定查询DSL .bool(b -> b // 多条件must组合,必须同时满足 .must(byName) .must(byBrand) .must(byMaxPrice) ) ), Product.class ); // 遍历命中结果 List<Hit<Product>> hits = response.hits().hits(); for (Hit<Product> hit: hits) { Product product = hit.source(); // 通过source获取结果 logger.info('Found product ' + product.getName() + ', score ' + hit.score()); } } }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多