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

【Elasticsearch】06-JavaRestClient查询

1. MatchAll查询与结果解析

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. 复合查询

分页、排序。

    @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. 高亮

    @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);
    }

将高亮结果解析出来。

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);
        }
    }

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

相关文章:

  • Linux迁移gitlab容器
  • 字节青训Marscode——8:找出整形数组中超过一半的数
  • 使用Python和OpenCV自动检测并去除图像中的字幕
  • Milvus×OPPO:如何构建更懂你的大模型助手
  • Linux-虚拟环境
  • vue初始化脚手架
  • springboot340“共享书角”图书借还管理系统(论文+源码)_kaic
  • YOLOv11融合[ECCV2024]WTConvNeXt中的WTConv模块及相关改进思路
  • 利用 Redis 与 Lua 脚本解决秒杀系统中的高并发与库存超卖问题
  • 使用 Elastic 和 Amazon Bedrock 制作混合地理空间 RAG 应用程序
  • Android V CTS-ON-GSI CtsGameManagerTestCases 测试fail
  • 一分钟解决 在多个dataframe相同位置中寻找最大值保留
  • 经典C语言代码——part 19(链表)
  • Vuex的基本使用
  • 利用Python爬虫精准获得Amazon商品详情数据
  • 40分钟学 Go 语言高并发:分布式系统理论基础
  • 基于大语言模型的智能Agent研究:定义、方法与展望(Large Language Model Based Intelligent Agents)
  • C语言经典题目详解(PTA题目)
  • c++领域展开第一幕——入门基础(命名空间、iostream、缺省参数、函数重载、nullptr、inline(内联函数))超详细!!!!
  • 【adb】AndroidStudio调试
  • 【python】列表
  • 面对深度伪造:OWASP发布专业应对指南
  • Java Web 1HTML快速入门
  • 代码随想录-算法训练营day29(回溯算法05:非递减子序列,全排列,全排列2)
  • 【C++算法】28.前缀和_除自身以外数组的乘积
  • 【C++高级开发应用篇】探索C++20中的协程:异步编程的强大工具