【Elasticsearch】06-JavaRestClient查询

1. MatchAll查询与结果解析

java 复制代码
public class ElasticQueryTest {
    private RestHighLevelClient client;

    @BeforeEach
    public void init() {
        client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://nuaamvp.cn:9200")
        ));
    }

    @AfterEach
    void tearDown() {
        if (client!=null) {
            try {
                client.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    @Test
    void testMatchAll() throws IOException {
        // 1. 创建 Request
        SearchRequest request = new SearchRequest("items");
        // 2. 组织请求参数
        request.source().query(
                QueryBuilders.matchAllQuery()
        );
        // 3. 发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4. 解析响应
        handleResponse(response);
    }
    public void handleResponse(SearchResponse response) {
        SearchHits searchHits = response.getHits();
        // 1. 获取总条数
        long total = searchHits.getTotalHits().value;
        System.out.println("共搜索到" + total + "条记录");
        // 2. 遍历结果数组
        SearchHit[] hits = searchHits.getHits();
        for(SearchHit hit:hits) {
            // 3. 得到原始 json 文档 _source
            String source = hit.getSourceAsString();
            // 4. 反序列化打印
            ItemDoc itemDoc = JSONUtil.toBean(source, ItemDoc.class);
            System.out.println(itemDoc);
        }
    }
}

2. 复合查询

分页、排序。

java 复制代码
    @Test
    void testMatch() throws IOException {
        // 1. 创建 Request
        SearchRequest request = new SearchRequest("items");

        // 2. 组织请求参数
        request.source().query(
                // QueryBuilders.multiMatchQuery("牛奶", "name", "category")
                // QueryBuilders.matchQuery("name", "智能手机")
                QueryBuilders.boolQuery()
                        .must(QueryBuilders.matchQuery("name", "脱脂牛奶"))
                        .filter(QueryBuilders.termQuery("brand", "德"))
                        .filter(QueryBuilders.rangeQuery("price").lt(30000))
        );
        // 3. 发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4. 解析响应
        handleResponse(response);
    }

3. 高亮

java 复制代码
    @Test
    void testMatch() throws IOException {
        // 0. 前端参数
        int pageNo = 1, pageSize = 5;

        // 1. 创建 Request
        SearchRequest request = new SearchRequest("items");

        // 2. 组织请求参数
        request.source().query(
                // QueryBuilders.multiMatchQuery("牛奶", "name", "category")
                // QueryBuilders.matchQuery("name", "智能手机")
                QueryBuilders.boolQuery()
                        .must(QueryBuilders.matchQuery("name", "脱脂牛奶"))
                        .filter(QueryBuilders.termQuery("brand", "德"))
                        .filter(QueryBuilders.rangeQuery("price").lt(30000))
        );
        // 2.1 分页
        request.source().from((pageNo-1)*pageSize).size(pageSize);
        // 2.2 排序
        request.source()
                .sort("sold", SortOrder.ASC)
                .sort("price", SortOrder.DESC);
        // 2.3 高亮
        request.source().highlighter(
                SearchSourceBuilder.highlight()
                        .field("name")
                        .preTags("<em>")
                        .postTags("</em>")
        );
        // 3. 发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4. 解析响应
        handleResponse(response);
    }

将高亮结果解析出来。

java 复制代码
public void handleResponse(SearchResponse response) {
        SearchHits searchHits = response.getHits();
        // 1. 获取总条数
        long total = searchHits.getTotalHits().value;
        System.out.println("共搜索到" + total + "条记录");
        // 2. 遍历结果数组
        SearchHit[] hits = searchHits.getHits();
        for(SearchHit hit:hits) {
            // 3. 得到原始 json 文档 _source
            String source = hit.getSourceAsString();
            // 4. 反序列化打印
            ItemDoc itemDoc = JSONUtil.toBean(source, ItemDoc.class);
            // 5. 获取高亮结果
            Map<String, HighlightField> hfs = hit.getHighlightFields();
            if (CollUtils.isNotEmpty(hfs)) {
                // 5.1 获取name的高亮结果
                HighlightField hf = hfs.get("name");
                if (hf!=null) {
                    String hfName = hf.getFragments()[0].string();
                    itemDoc.setName(hfName);
                }
            }
            System.out.println(itemDoc);
        }
    }
相关推荐
captain_AIouo几秒前
深耕海外市场,autoAGC攻破品牌跨境内容运营难题
大数据·人工智能·经验分享·产品运营·aigc·内容运营
志栋智能10 分钟前
超自动化运维:如何降低人为错误?
大数据·运维·网络·人工智能·自动化
久菜盒子工作室12 分钟前
生益科技 经营分析
大数据·人工智能·科技
isNotNullX13 分钟前
维度建模有哪些类型?详解维度建模三大模型
大数据
互联网江湖21 分钟前
中国跨境电商,正在走出漫长的雨季?
大数据·人工智能
幂律智能28 分钟前
从工具到入口:以组织记忆闭环夯实智能价值
大数据·人工智能
暴躁小师兄数据学院43 分钟前
【AI大数据工程师特训笔记】第08讲:集合运算与超级函数
大数据·笔记·sql·ai·postgresql
蓝速科技1 小时前
蓝速科技 3D 全息数字人舱实景效能与选型指南
大数据·人工智能·科技·3d·交互
蘑菇丁1 小时前
招聘大数据运维工程师(郑州)
大数据·运维
cy_cy0021 小时前
折幕影院怎样实现虚实一体?
大数据·科技·人机交互·交互·软件构建