当前位置: 首页 > article >正文

[微服务]RestClient客户端

快速入门

使用RestClient客户端进行数据搜索可以分为两步

  1. 构建并发起请求

代码解读:

  • 第一步,创建SearchRequest对象,指定索引库名
  • 第二步,利用request.source()构建DSL,DSL中可以包含查询、分页、排序、高亮等
    • query():代表查询条件,利用QueryBuilders.matchAllQuery()构建一个match_all查询的DSL
  • 第三步,利用client.search()发送请求,得到响应

核心步骤:

  • 这里关键的API有两个,一个是request.source(),它构建的就是DSL中的完整JSON参数。其中包含了querysortfromsizehighlight等所有功能:

  • 另一个是QueryBuilders,其中包含了我们学习过的各种叶子查询复合查询等:

  1. 解析查询结果

elasticsearch返回的结果是一个JSON字符串,结构包含:

  • hits:命中的结果
    • total:总条数,其中的value是具体的总条数值
    • max_score:所有结果中得分最高的文档的相关性算分
    • hits:搜索结果的文档数组,其中的每个文档都是一个json对象
      • _source:文档中的原始数据,也是json对象

因此,我们解析响应结果,就是逐层解析JSON字符串,流程如下:

  • SearchHits:通过response.getHits()获取,就是JSON中的最外层的hits,代表命中的结果
    • SearchHits#getTotalHits().value:获取总条数信息
    • SearchHits#getHits():获取SearchHit数组,也就是文档数组
      • SearchHit#getSourceAsString():获取文档结果中的_source,也就是原始的json文档数据

示例

  1. 新建测试类

public class ElasticSearchTest {

    private RestHighLevelClient client;

    @Test
    void test() {
        System.out.println("client =" + client);
    }


    @BeforeEach
    void setup() {
        client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.1.97:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        if (client != null) {
            client.close();
        }
    }
}
  1. 创建并发送请求, 解析结果
public class ElasticSearchTest {

    private RestHighLevelClient client;

    @Test
    void test() {
        System.out.println("client =" + client);
    }

    @Test
    void testMatchAll() throws IOException {
        //1.创建request对象
        SearchRequest request = new SearchRequest("items");
        //2.配置request参数
        request.source()
                .query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        System.out.println("response = " + response);

        //4.解析结果
        SearchHits searchHits = response.getHits();
        // 总条数
        long total = searchHits.getTotalHits().value;
        System.out.println("total = " + total);
        // 命中的数据
        SearchHit[] hits = searchHits.getHits();

        for (SearchHit hit : hits) {
            // 获取source结果
            String json = hit.getSourceAsString();
            // 转为ItemDoc
            ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);
            System.out.println("doc = " + doc);
        }

    }


    @BeforeEach
    void setup() {
        client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.1.97:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        if (client != null) {
            client.close();
        }
    }
}
  1. 执行结果

构建查询条件

全文检索的查询条件构造API如下

精确查询的查询条件构造API如下:

布尔查询的查询条件构造API如下:

构建复杂查询条件的搜索

需求: 利用lavaRestClient实现搜索功能, 条件如下

  1. 搜索关键字为脱脂牛奶
  2. 品牌必须为德亚
  3. 价格必须低于300
public class ElasticSearchTest {

    private RestHighLevelClient client;

    @Test
    void test() {
        System.out.println("client =" + client);
    }

    @Test
    void testSearch() throws IOException {
        //1.创建request对象
        SearchRequest request = new SearchRequest("items");
        //2.组织DSL参数
        request.source().query(
            QueryBuilders.boolQuery()
            .must(QueryBuilders.matchQuery("name", "脱脂牛奶"))
            .filter(QueryBuilders.termQuery("brand", "德亚"))
            .filter(QueryBuilders.rangeQuery("price").lt(3000))
        );
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        System.out.println("response = " + response);

        //4.解析结果
        parseResponseResult(response);

    }

    private void parseResponseResult(SearchResponse response) {
        //4.解析结果
        SearchHits searchHits = response.getHits();
        // 总条数
        long total = searchHits.getTotalHits().value;

        System.out.println("total = " + total);
        // 命中的数据
        SearchHit[] hits = searchHits.getHits();

        for (SearchHit hit : hits) {
            // 获取source结果
            String json = hit.getSourceAsString();
            // 转为ItemDoc
            ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);
            System.out.println("doc = " + doc);
        }
    }


    @BeforeEach
    void setup() {
        client = new RestHighLevelClient(RestClient.builder(
            HttpHost.create("http://192.168.1.97:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        if (client != null) {
            client.close();
        }
    }
}

排序和分页

与query类似,排序和分页参数都是基于request.source()来设置:

public class ElasticSearchTest {

    private RestHighLevelClient client;

    @Test
    void test() {
        System.out.println("client =" + client);
    }


    @Test
    void testSortAndPage() throws IOException {
        // 模拟前端分页参数
        int pageNo = 1, pageSize = 5;

        //1.创建request对象
        SearchRequest request = new SearchRequest("items");
        //2.组织DSL条件
        //2.1query条件
        request.source().query(
                QueryBuilders.matchAllQuery()
        );
        //2.2.分页条件
        request.source().from((pageNo - 1) * pageSize).size(pageSize);
        //2.3 排序条件
        request.source()
                .sort("sold", SortOrder.DESC)
                .sort("price",SortOrder.ASC);
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //4.解析结果
        parseResponseResult(response);

    }

    private void parseResponseResult(SearchResponse response) {
        //4.解析结果
        SearchHits searchHits = response.getHits();
        // 总条数
        long total = searchHits.getTotalHits().value;

        System.out.println("total = " + total);
        // 命中的数据
        SearchHit[] hits = searchHits.getHits();

        for (SearchHit hit : hits) {
            // 获取source结果
            String json = hit.getSourceAsString();
            // 转为ItemDoc
            ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);
            System.out.println("doc = " + doc);
        }
    }


    @BeforeEach
    void setup() {
        client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.1.97:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        if (client != null) {
            client.close();
        }
    }
}

高亮展示

高亮显示的条件构造API如下

高亮显示的结果解析API如下:

示例

public class ElasticSearchTest {

    private RestHighLevelClient client;

    @Test
    void test() {
        System.out.println("client =" + client);
    }

    @Test
    void testHighLight() throws IOException {
        //1.创建request对象
        SearchRequest request = new SearchRequest("items");
        //2.组织DSL条件
        //2.1query条件
        request.source().query(
                QueryBuilders.matchQuery("name", "脱脂牛奶")
        );
        //2.2.高亮条件
        request.source().highlighter(SearchSourceBuilder.highlight().field("name"));
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //4.解析结果
        parseResponseResult(response);

    }

    private void parseResponseResult(SearchResponse response) {
        //4.解析结果
        SearchHits searchHits = response.getHits();
        // 总条数
        long total = searchHits.getTotalHits().value;

        System.out.println("total = " + total);
        // 命中的数据
        SearchHit[] hits = searchHits.getHits();

        for (SearchHit hit : hits) {
            // 获取source结果
            String json = hit.getSourceAsString();
            // 转为ItemDoc
            ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);
            // 按需处理高亮结果
            Map<String, HighlightField> hfs = hit.getHighlightFields();
            if (hfs != null && !hfs.isEmpty()) {
                // 根据高亮字段名获取高亮结果
                HighlightField hf = hfs.get("name");
                // 获取高亮结果, 覆盖非高亮结果
                String name = hf.fragments()[0].string();
                doc.setName(name);
            }

            System.out.println("doc = " + doc);
        }
    }


    @BeforeEach
    void setup() {
        client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.1.97:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        if (client != null) {
            client.close();
        }
    }
}


http://www.kler.cn/a/464747.html

相关文章:

  • 形象地理解UE4中的数据结构 TLinkedListBase
  • 【Yarn】通过JMX采集yarn相关指标的Flink任务核心逻辑
  • Django 中数据库迁移命令
  • Maven 教程之 pom.xml 详解
  • Oracle ASM命令行工具asmcmd命令及其使用方法
  • Swift Combine 学习(五):Backpressure和 Scheduler
  • 破解密码
  • C# 实现串口通信
  • re:Invent 2024: Blueshift 和 VidMob 谈广告和营销中的生成性人工智能应用
  • JavaWeb开发(一)IDEA工具下载、配置、项目创建、Tomcat配置
  • 阿里云人工智能工程师ACA认证免费课程学习笔记
  • 【C#】校验和计算
  • Unreal虚幻引擎使用遇到的问题记录
  • 4.为什么java不支持多重继承?
  • STM32-笔记21-脉冲计数
  • 鸿蒙OS的API进行交互
  • Science Robotics让软机器人“活”得更久的3D打印!
  • XSS讲解
  • AndroidStudio运行报错Invalid keystore format解决办法
  • PHP框架+gatewayworker实现在线1对1聊天--聊天界面布局+创建websocket连接(5)
  • JVM对象创建过程
  • LeetCode 3146 两个字符串的排列差
  • 车路云网图安全风险复杂交织
  • 分布式、集群、Mac M1装Ubuntu、Mac扩容
  • 每天40分玩转Django:Django实战 - 社交网络开发
  • 招银网路Java后端一面,难度有点大!