首页 > 编程语言 >Java High Level Rest Client---查询文档

Java High Level Rest Client---查询文档

时间:2023-06-04 15:11:17浏览次数:41  
标签:hits Java Level request responseHits --- source 文档 hotelDoc

查询文档的基本步骤

  • 1)准备Request对象
  • 2)准备请求参数
  • 3)发起请求
  • 4)解析响应

示例解析
以match_all查询为例

代码解读:

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

另一个是QueryBuilders,其中包含match、term、function_score、bool等各种查询:

解析响应

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. 创建SearchRequest对象
  2. 准备Request.source(),也就是DSL。
    ① QueryBuilders来构建查询条件
    ② 传入Request.source() 的 query() 方法
  3. 发送请求,得到结果
  4. 解析结果(参考JSON结果,从外到内,逐层解析)

代码示例
查询全部

点击查看代码
//查询全部
    @Test
    public void getAll() throws Exception{
        // 1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source()
                .query(QueryBuilders.matchAllQuery());
        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //处理结果
        SearchHits responseHits = response.getHits();
        long hitsTotalHits = responseHits.getTotalHits().value;//获取总条数
        System.out.println("共获取数据"+hitsTotalHits+"条");
        SearchHit[] hits = responseHits.getHits();//文档数组
        //遍历文档数组
        for (int i = 0; i < hits.length; i++) {
            //获取文档的source
            String json = hits[i].getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc--->"+hotelDoc);
        }
    }

match查询

点击查看代码
//match查询
    @Test
    public void match() throws Exception{
        //准备request
        SearchRequest request = new SearchRequest("hotel");
        // 准备dsl语句
        request.source().query(QueryBuilders.matchQuery("all","希尔顿"));
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 解析响应
        SearchHits responseHits = response.getHits();
        long total = responseHits.getTotalHits().value;//获取总条数
        System.out.println("共获取数据"+total+"条");
        SearchHit[] hits = responseHits.getHits();//文档数组
        for (int i = 0; i < hits.length; i++) {
            //获取文档的source
            String json = hits[i].getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc--->"+hotelDoc);
        }
    }

精确查询

点击查看代码
@Test
    public void term() throws Exception{
        //准备request对象
        SearchRequest request = new SearchRequest("hotel");
        //准备dsl语句
        request.source().query(QueryBuilders.termQuery("city","北京"));
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析数据
        SearchHits responseHits = response.getHits();
        long total = responseHits.getTotalHits().value;//获取总条数
        System.out.println("共获取数据"+total+"条");
        SearchHit[] hits = responseHits.getHits();//文档数组
        for (int i = 0; i < hits.length; i++) {
            //获取文档的source
            String json = hits[i].getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc--->"+hotelDoc);
        }
    }

范围查询

点击查看代码
//范围查询
@Test
    public void range() throws Exception{
        //准备request对象
        SearchRequest request = new SearchRequest("hotel");
        //准备dsl语句
        request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(150));
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析数据
        SearchHits responseHits = response.getHits();
        long total = responseHits.getTotalHits().value;//获取总条数
        System.out.println("共获取数据"+total+"条");
        SearchHit[] hits = responseHits.getHits();//文档数组
        for (int i = 0; i < hits.length; i++) {
            //获取文档的source
            String json = hits[i].getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc--->"+hotelDoc);
        }
    }

布尔查询

点击查看代码
//布尔查询
    @Test
    public void bool() throws Exception{
        //准备request对象
        SearchRequest request = new SearchRequest("hotel");
        //准备dsl语句
        //准备BooleanQuery
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        //添加term条件,城市必须在上海
        boolQuery.must(QueryBuilders.termQuery("city","上海"));
        //添加range条件,过滤掉价格在200元以上的
        boolQuery.filter(QueryBuilders.rangeQuery("price").lte(200));
        request.source().query(boolQuery);
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析数据
        SearchHits responseHits = response.getHits();
        long total = responseHits.getTotalHits().value;//获取总条数
        System.out.println("共获取数据"+total+"条");
        SearchHit[] hits = responseHits.getHits();//文档数组
        for (int i = 0; i < hits.length; i++) {
            //获取文档的source
            String json = hits[i].getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc--->"+hotelDoc);
        }
    }

排序,分页查询

点击查看代码
//排序,分页查询
    @Test
    public void sortAndPage() throws Exception{
        // 页码,每页大小
        int page = 1, size = 5;
        //准备request对象
        SearchRequest request = new SearchRequest("hotel");
        //准备dsl语句
        request.source().query(QueryBuilders.matchAllQuery());//查询
        request.source().from((page - 1) * size).size(size);//分页
        request.source().sort("price", SortOrder.ASC);//价格升序
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析数据
        SearchHits responseHits = response.getHits();
        long total = responseHits.getTotalHits().value;//获取总条数
        System.out.println("共获取数据"+total+"条");
        SearchHit[] hits = responseHits.getHits();//文档数组
        for (int i = 0; i < hits.length; i++) {
            //获取文档的source
            String json = hits[i].getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc--->"+hotelDoc);
        }
    }

高亮处理

点击查看代码
//高亮处理
    @Test
    public void highlight() throws Exception{
        // 1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        // 2.1.query
        request.source().query(QueryBuilders.matchQuery("all", "如家"));
        // 2.2.高亮
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4.解析响应
        // 4.解析响应
        SearchHits searchHits = response.getHits();
        // 4.1.获取总条数
        long total = searchHits.getTotalHits().value;
        System.out.println("共搜索到" + total + "条数据");
        // 4.2.文档数组
        SearchHit[] hits = searchHits.getHits();
        // 4.3.遍历
        for (SearchHit hit : hits) {
            // 获取文档source
            String json = hit.getSourceAsString();
            // 反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            // 获取高亮结果
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (!CollectionUtils.isEmpty(highlightFields)) {
                // 根据字段名获取高亮结果
                HighlightField highlightField = highlightFields.get("name");
                if (highlightField != null) {
                    // 获取高亮值
                    String name = highlightField.getFragments()[0].string();
                    // 覆盖非高亮结果
                    hotelDoc.setName(name);
                }
            }
            System.out.println("hotelDoc --->" + hotelDoc);
        }
    }

坐标查询

点击查看代码
//根据坐标查询
    @Test
    public void geoDistance() throws Exception{
        String location="31.21,121.5";
        //准备request对象
        SearchRequest request = new SearchRequest("hotel");
        //准备dsl语句
        request.source().sort(SortBuilders
                .geoDistanceSort("location",new GeoPoint(location))
                .order(SortOrder.ASC)
                .unit(DistanceUnit.KILOMETERS)
        );
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析数据
        SearchHits responseHits = response.getHits();
        long total = responseHits.getTotalHits().value;//获取总条数
        System.out.println("共获取数据"+total+"条");
        SearchHit[] hits = responseHits.getHits();//文档数组
        for (int i = 0; i < hits.length; i++) {
            //获取文档的source
            String json = hits[i].getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println("hotelDoc--->"+hotelDoc);
            //获取距离值
            Object[] sortValues = hits[i].getSortValues();
            System.out.println("距离坐标距离--->"+sortValues[0]+"km");
        }
    }

标签:hits,Java,Level,request,responseHits,---,source,文档,hotelDoc
From: https://www.cnblogs.com/wzh-Official/p/17455711.html

相关文章

  • CXF入门教程(2) -- 第一个客户端
    文中对应的代码已经上传,与教程(1)中的service相对应。为调试方便,将service和client都放在了同一个工程中,不过是在不同的包中;本文对应的两个基本客户端在com.neareast.test.cxf.client.consumer包中,服务端ServiceTest类在com.neareast.test.cxf.server.service包中。代码地址如下:最常......
  • java.lang.OutOfMemoryError: PermGen space及其解决方法
    PermGenspace的全称是PermanentGenerationspace,是指内存的永久保存区域OutOfMemoryError:PermGenspace从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被Load的时候被放入PermGenspace区域,它和和存放Inst......
  • 网络爬虫--爬取泉州,福州,厦门历史天气和近七日天气--数据可视化
     一:选题背景:通过爬取各个城市的历史天气数据及近日数据,来进行对天气的数据分析与可视化。从而帮助我们的生活更加便利。所爬取的网站为2345天气王https://tianqi.2345.com/wea_forty/71924.htm这里我们进入网站后右键检查,点击网络这一栏,并刷新页面能够看到有两个文件,而我们所......
  • vscode插件开发----在编辑栏上增加菜单项
    在package.json做如下配置:"contributes":{"commands":[{"command":"codeStat.countCurFile","title":"统计当前文件"}],"menus":{"editor/t......
  • 在java环境下读取xml文件的方法主要有4种:DOM、SAX、JDOM、JAXB
    dom4j中文乱码[url]http://blog.sina.com.cn/s/blog_3d25e30f0100cyzi.html[/url]org.dom4j.io.XMLWriterxmlWriter=neworg.dom4j.io.XMLWriter(new[color=red]FileOutputStream[/color](fileName));在java环境下读取xml文件的方法主要有4种:DOM、SA......
  • 搭建Hibernate日志-log4jdbc
    官方:[url]https://code.google.com/p/log4jdbc/[/url]log4jdbc分析sql性能[url]http://hongliangpan.iteye.com/blog/1088398[/url]xml配置方法:log4jdbc日志框架介绍[url]http://blog.sina.com.cn/s/blog_57769b7b0101m1il.html[/url][url]http://xia......
  • hibernate------hql总结
    第14章HQL:Hibernate查询语言[url]http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/queryhql.html[/url][url]http://kuangbaoxu.iteye.com/blog/193076[/url][color=red][b]1.查询整个映射对象所有字段[/b][/color]//直接from查询出来的是一......
  • 密码工程-大素数
    任务详情在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务利用大整数库(GMP或者OpenSSL),参考《密码工程》p113伪代码实现GenerateLargePrime函数(10‘)在测试代码中产生一个在范围l=2^255至u=2^256-1内的素数。(5‘)用OpenSSL验证你产生的素数是不是正确(5’)提交......
  • adm-jclass: 一个面向对象编程的js库
    [url]https://code.google.com/p/adm-jclass/[/url]:Ajavascriptlibrarythatallowshighlyobject-orientedapplicationprogramminginyourbrowser.介绍:[url]https://code.google.com/p/adm-jclass/wiki/jClassDocumentation[/url]jClassisa......
  • nodejs vuejs java python 入门到高级视频
    多抽出一分钟学习,让你的生命更加精彩!高性能高可用Yii2.0电商平台仿京东商城高级组件MySQLLVSDocker+Kubernetes(k8s)微服务容器化实战实战Docker到Kubernetes技术系列视频教程@黑马JAVAEE19期⑭jQuery实战经典【No0066】尚学堂架构师视频06、微服务架构00、SpringBoot微服务架......