zoukankan      html  css  js  c++  java
  • Java API操作ES

    Java API操作ES

    Elastic Search软件是由Java语言开发的,所以也可以通过Java API的方法对Elastic Search服务进行访问。

    1. 引入POM文件

        <properties>
            <elasticsearch.version>7.6.2</elasticsearch.version>
        </properties>
    
        <dependencies>
            <!-- elasticsearch-rest-high-level-client -->
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <version>${elasticsearch.version}</version>
            </dependency>
            
            <!--fast json-->
          	 <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.69</version>
            </dependency>
          
            <!--引入spring-boot-test-->
          	<dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
        </dependencies>
    

    注:Elastic Search官方已经给出早期版本的客户端对象已经不在推荐使用,而且在未来版本中会被删除。因此在引入pom文件中直接使用高级REST客户端对象。

    image-20211102153249116

    https://www.elastic.co/guide/en/elasticsearch/reference/current/api-java.html

    2. 编写ES配置类

    @Configuration
    public class ElasticsearchConfiguration {
        @Value("${elasticsearch.host}")
        private String host;
    
        @Value("${elasticsearch.port}")
        private int port;
    
        @Bean
        public RestHighLevelClient initRestClient() {
    
            RestClientBuilder builder= null;
            builder = RestClient.builder(new HttpHost(host, port));
            return new RestHighLevelClient(builder);
        }
    
    }
    

    可以将es的host和port信息通过外部配置文件方式引入

    elasticsearch:
      host: 127.0.0.1
      port: 9200
    

    3.索引的基本操作

    使用SpringBootTest创建测试类,并通过Junit的@After注解完成客户端关闭操作。

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Slf4j
    public class ESIndexTest {
        @Autowired
        private RestHighLevelClient esClient;
    
        private final static String ES_INDEX="foodie_shop";
    
        //关闭连接
        @After
        public void closeClient(){
            try {
                esClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     }
    

    3.1 创建索引

        @Test
        public void testCreateIndex(){
            CreateIndexRequest request = new CreateIndexRequest(ES_INDEX);
            try {
                CreateIndexResponse response = esClient.indices().create(request, RequestOptions.DEFAULT);
                //响应状态
                boolean acknowledged = response.isAcknowledged();
                log.info("索引创建状态:{}",acknowledged);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    

    后台打印日志

    2021-11-02 15:46:08.180  INFO 4751 --- [           main] c.h.s.c.ESIndexTest                      : 索引创建状态:true
    

    3.2 查询索引

        @Test
        public void searchIndex() throws IOException {
            // 查询索引
            GetIndexRequest request = new GetIndexRequest(ES_INDEX);
            GetIndexResponse response = esClient.indices().get(request, RequestOptions.DEFAULT);
            log.info("aliases {}",response.getAliases());
            log.info("mappings {}",response.getMappings());
            log.info("settings {}",response.getSettings());
        }
    
    2021-11-02 15:48:04.972  INFO 4770 --- [           main] c.h.s.c.ESIndexTest                      : aliases {user=[]}
    2021-11-02 15:48:04.973  INFO 4770 --- [           main] c.h.s.c.ESIndexTest                      : mappings {user=org.elasticsearch.cluster.metadata.MappingMetaData@8ce87599}
    2021-11-02 15:48:04.973  INFO 4770 --- [           main] c.h.s.c.ESIndexTest                      : settings {user={"index.creation_date":"1635839167732","index.number_of_replicas":"1","index.number_of_shards":"1","index.provided_name":"user","index.uuid":"Ew4nD6V6Q7uKr-BCAUTiKA","index.version.created":"7100299"}}
    
    

    3.3 删除索引

        @Test
        public void deleteIndex() throws IOException {
            //删除索引 - 请求对象
            DeleteIndexRequest request =new DeleteIndexRequest(ES_INDEX);
            //发送请求
            AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);
            //操作结果
            log.info("操作结果:{}",response.isAcknowledged());
        }
    

    后台打印日志信息

    2021-11-02 15:49:51.578  INFO 4788 --- [           main] c.h.s.c.ESIndexTest                      : 操作结果:true
    

    4. 文档的基本操作

    在创建文档之前,需要先创建文档对象实体类对象模型

    @Data
    @TableName("t_user")
    public class User {
    
        /**
         * erpId
         */
        @TableId(type = IdType.AUTO)
        private Long erpId;
        /**
         * 用户名
         */
        private String erpName;
    
        /**
         * 真实姓名
         */
        private String realName;
    
        /**
         * 性别。0表示男,1表示女,2代表未知
         */
        private Integer gender;
    
        /**
         * 头像
         */
        private String avatar;
    
        /**
         * 电话
         */
        private String phone;
    
        /**
         * 邮箱
         */
        private String email;
        /**
         * 密码
         */
        private String password;
    
        /**
         * 是否删除 0表示未删除,1表示已删除
         */
        private Integer isDeleted;
    
        /**
         * 0代表超管,1代表普通用户
         */
        private Integer priorityLevel;
        /**
         * 创建时间
         */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date createTime;
        /**
         * 更新时间
         */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date updateTime;
    
    
    

    4.1 新增文档

    创建数据,添加到对应的文档中

        @Test
        public void testInsert() throws IOException {
            IndexRequest request = new IndexRequest();
            request.index("user").id("1001");
    
            User user = new User();
            user.setErpName("zhangsansan");
            user.setRealName("张三三");
            user.setPhone("12345654");
            user.setEmail("45456222333@qq.com");
            user.setPassword("13221");
            user.setIsDeleted(0);
            user.setCreateTime(new Date());
            user.setUpdateTime(new Date());
    
            //向ES插入数,必须转为JSON
    
            ObjectMapper mapper = new ObjectMapper();
            String userJson = mapper.writeValueAsString(user);
            request.source(userJson,XContentType.JSON);
            IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
            log.info("插入数据结果:{}", JSON.toJSONString(response));
        }
    

    执行成功后日志输出信息

    2021-11-02 15:54:49.037  INFO 4837 --- [           main] c.h.s.c.ESDocTest                        : 插入数据结果:{"fragment":false,"id":"1001","index":"user","primaryTerm":1,"result":"CREATED","seqNo":0,"shardId":{"fragment":true,"id":-1,"index":{"fragment":false,"name":"user","uUID":"_na_"},"indexName":"user"},"shardInfo":{"failed":0,"failures":[],"fragment":false,"successful":1,"total":2},"type":"_doc","version":1}
    
    

    image-20211102155747244

    4.2 修改文档

        @Test
        public void testUpdate() throws IOException {
            UpdateRequest request = new UpdateRequest();
            request.index("user").id("1001");
            request.doc(XContentType.JSON,"realName","李思思");
            UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
            log.info("插入数据结果:{}", JSON.toJSONString(response));
        }
    

    执行成功后日志输出信息

    2021-11-02 15:58:09.136  INFO 4868 --- [           main] c.h.s.c.ESDocTest                        : 插入数据结果:{"fragment":false,"id":"1001","index":"user","primaryTerm":1,"result":"UPDATED","seqNo":1,"shardId":{"fragment":true,"id":-1,"index":{"fragment":false,"name":"user","uUID":"_na_"},"indexName":"user"},"shardInfo":{"failed":0,"failures":[],"fragment":false,"successful":1,"total":2},"type":"_doc","version":2}
    
    

    image-20211102155929693

    4.3 查询文档

        @Test
        public void testSearch() throws IOException {
            GetRequest request = new GetRequest();
            request.index("user").id("1001");
            GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
            String jsonString = response.getSourceAsString();
            log.info("查询结果:{}",jsonString);
        }
    

    执行成功后日志输出信息

    2021-11-02 16:00:47.092  INFO 4906 --- [           main] c.h.s.c.ESDocTest                        : 查询结果:{"erpId":null,"erpName":"zhangsansan","realName":"李思思","gender":null,"avatar":null,"phone":"12345654","email":"45456222333@qq.com","password":"13221","isDeleted":0,"priorityLevel":null,"createTime":"2021-11-02 07:54:48","updateTime":"2021-11-02 07:54:48"}
    
    

    4.4 删除文档

        @Test
        public void testDelete() throws IOException {
            DeleteRequest request = new DeleteRequest();
            request.index("user").id("1001");
            DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
            log.info("删除结果:{}",JSON.toJSONString(response));
        }
    

    执行成功后日志输出信息

    2021-11-02 16:01:53.527  INFO 4920 --- [           main] c.h.s.c.ESDocTest                        : 删除结果:{"fragment":false,"id":"1001","index":"user","primaryTerm":1,"result":"DELETED","seqNo":2,"shardId":{"fragment":true,"id":-1,"index":{"fragment":false,"name":"user","uUID":"_na_"},"indexName":"user"},"shardInfo":{"failed":0,"failures":[],"fragment":false,"successful":1,"total":2},"type":"_doc","version":3}
    
    

    4.5 批量操作(新增)

        @Test
        public void testBatchInsert() throws IOException {
            BulkRequest request =new BulkRequest();
            request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age", "10", "sex","女","birthday","2021-10-23"));
            request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi", "age", "30", "sex","女","birthday","2021-10-22"));
            request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu1", "age", "40", "sex","男","birthday","2021-10-21"));
            request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "wangwu2", "age", "20", "sex","女","birthday","2021-10-20"));
            request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "wangwu3", "age", "50", "sex","男","birthday","2022-10-23"));
            request.add(new IndexRequest().index("user").id("1006").source(XContentType.JSON, "name", "wangwu4", "age", "20", "sex","男","birthday","2021-10-19"));
    
            BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
            log.info("批处理消耗的时间{},处理结果:{}",response.getTook(),response.getItems());
        }
    

    执行成功后输出的日志信息

    2021-11-02 16:16:07.391  INFO 5078 --- [           main] c.h.s.c.ESBatchTest                      : 批处理消耗的时间534ms,处理结果:[org.elasticsearch.action.bulk.BulkItemResponse@1d06f16f, org.elasticsearch.action.bulk.BulkItemResponse@4fa4f485, org.elasticsearch.action.bulk.BulkItemResponse@68dd39d2, org.elasticsearch.action.bulk.BulkItemResponse@4a44cfc0, org.elasticsearch.action.bulk.BulkItemResponse@60e3c26e, org.elasticsearch.action.bulk.BulkItemResponse@80b122b]
    

    image-20211102161712669

    4.6 批量操作(删除)

        @Test
        public void testBatchDelete() throws IOException {
            BulkRequest request =new BulkRequest();
            request.add(new DeleteRequest().index("user").id("1001"));
            request.add(new DeleteRequest().index("user").id("1002"));
            request.add(new DeleteRequest().index("user").id("1003"));
            BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
            log.info("批处理消耗的时间 {}",response.getTook());
        }
    

    执行成功后输出的日志信息

    2021-11-02 16:17:33.395  INFO 5095 --- [           main] c.h.s.c.ESBatchTest                      : 批处理消耗的时间 35ms
    

    image-20211102161815314

    5. 高级查询

    使用批量新增操作,插入测试数据。

        @Test
        public void testBatchInsert() throws IOException {
            BulkRequest request =new BulkRequest();
            request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age", 10, "sex","女","birthday","2021-10-23"));
            request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi", "age", 30, "sex","女","birthday","2021-10-22"));
            request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu1", "age", 40, "sex","男","birthday","2021-10-21"));
            request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "wangwu2", "age", 20, "sex","女","birthday","2021-10-20"));
            request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "wangwu3", "age", 50, "sex","男","birthday","2022-10-23"));
            request.add(new IndexRequest().index("user").id("1006").source(XContentType.JSON, "name", "wangwu4", "age", 20, "sex","男","birthday","2021-10-19"));
    
            BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
            log.info("批处理消耗的时间{},处理结果:{}",response.getTook(),response.getItems());
        }
    

    5.1 查询所有索引数据

        @Test
        public void testSearchQuery() throws IOException {
            SearchRequest request =new SearchRequest();
            request.indices("user");
            //全量查询
            SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
            request.source(query);
            SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
            SearchHits hits = response.getHits();
    
            log.info("全量查询返回的结果数量:{}",hits.getTotalHits());
            //循环打印匹配到的数据
            for(SearchHit hit:hits){
                System.out.println(hit.getSourceAsString());
            }
        }
    

    执行成功后返回的结果信息

    2021-11-02 16:21:02.266  INFO 5140 --- [           main] c.h.s.c.ESQueryTest                      : 全量查询返回的结果数量:6 hits
    {"name":"wangwu2","age":"20","sex":"女","birthday":"2021-10-20"}
    {"name":"wangwu3","age":"50","sex":"男","birthday":"2022-10-23"}
    {"name":"wangwu4","age":"20","sex":"男","birthday":"2021-10-19"}
    {"name":"zhangsan","age":"10","sex":"女","birthday":"2021-10-23"}
    {"name":"lisi","age":"30","sex":"女","birthday":"2021-10-22"}
    {"name":"wangwu1","age":"40","sex":"男","birthday":"2021-10-21"}
    

    5.2 条件查询

    term:查询条件为关键字

        @Test
        public void testSearchConditionQuery() throws IOException {
            SearchRequest request =new SearchRequest();
            request.indices("user");
            request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age","30")));
            SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
            SearchHits hits = response.getHits();
            log.info("全量查询返回的结果数量:{}",hits.getTotalHits());
            for(SearchHit hit:hits){
                System.out.println(hit.getSourceAsString());
            }
        }
    

    执行成功后返回的结果信息

    2021-11-02 16:22:59.586  INFO 5162 --- [           main] c.h.s.c.ESQueryTest                      : 全量查询返回的结果数量:1 hits
    {"name":"lisi","age":"30","sex":"女","birthday":"2021-10-22"}
    

    5.3 分页查询

        @Test
        public void testLimitPageQuery() throws IOException {
            SearchRequest request =new SearchRequest();
            request.indices("user");
            //全量查询
            SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
            builder.from(0);
            builder.size(2);
            request.source(builder);
            SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
            SearchHits hits = response.getHits();
            log.info("全量查询返回的结果数量:{}",hits.getTotalHits());
            for(SearchHit hit:hits){
                System.out.println(hit.getSourceAsString());
            }
        }
    

    执行成功后返回的结果信息

    2021-11-02 16:24:41.702  INFO 5177 --- [           main] c.h.s.c.ESQueryTest                      : 全量查询返回的结果数量:6 hits
    {"name":"wangwu2","age":"20","sex":"女","birthday":"2021-10-20"}
    {"name":"wangwu3","age":"50","sex":"男","birthday":"2022-10-23"}
    
    

    image-20211102162524179

    5.4 排序

        @Test
        public void testOrder() throws IOException {
            SearchRequest request =new SearchRequest();
            request.indices("user");
            //全量查询
            SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
            //排序
            builder.sort("age", SortOrder.DESC);
            request.source(builder);
            SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
            SearchHits hits = response.getHits();
            log.info("全量查询返回的结果数量:{}",hits.getTotalHits());
            for(SearchHit hit:hits){
                System.out.println(hit.getSourceAsString());
            }
        }
    

    执行成功后返回的结果信息

    2021-11-02 16:33:18.814  INFO 5283 --- [           main] c.h.s.c.ESQueryTest                      : 全量查询返回的结果数量:6 hits
    {"name":"wangwu3","age":50,"sex":"男","birthday":"2022-10-23"}
    {"name":"wangwu1","age":40,"sex":"男","birthday":"2021-10-21"}
    {"name":"lisi","age":30,"sex":"女","birthday":"2021-10-22"}
    {"name":"wangwu2","age":20,"sex":"女","birthday":"2021-10-20"}
    {"name":"wangwu4","age":20,"sex":"男","birthday":"2021-10-19"}
    {"name":"zhangsan","age":10,"sex":"女","birthday":"2021-10-23"}
    

    5.5 过滤字段

        @Test
        public void testFilterFields() throws IOException {
            SearchRequest request =new SearchRequest();
            request.indices("user");
            //全量查询
            SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
            String[] exclude = {"birthday"};
            String[] includes = {"name","age"};
            builder.fetchSource(includes,exclude);
            request.source(builder);
            SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
            SearchHits hits = response.getHits();
            log.info("全量查询返回的结果数量:{}",hits.getTotalHits());
            for(SearchHit hit:hits){
                System.out.println(hit.getSourceAsString());
            }
        }
    

    执行成功后返回的结果信息

    2021-11-02 16:35:36.099  INFO 5313 --- [           main] c.h.s.c.ESQueryTest                      : 全量查询返回的结果数量:6 hits
    {"name":"zhangsan","age":10}
    {"name":"lisi","age":30}
    {"name":"wangwu1","age":40}
    {"name":"wangwu2","age":20}
    {"name":"wangwu3","age":50}
    {"name":"wangwu4","age":20}
    

    5.6 Bool查询

        @Test
        public void testCombinationQuery() throws IOException {
            SearchRequest request =new SearchRequest();
            request.indices("user");
            SearchSourceBuilder builder = new SearchSourceBuilder();
    
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            // 必须包含
            boolQueryBuilder.must(QueryBuilders.termQuery("age", "30"));
            // 一定不含
    //        boolQueryBuilder.mustNot(QueryBuilders.matchQuery("name", "zhangsan"));
            // 可能包含
    //        boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "男"));
    
            builder.query(boolQueryBuilder);
            request.source(builder);
            SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
            SearchHits hits = response.getHits();
            log.info("全量查询返回的结果数量:{}",hits.getTotalHits());
            for(SearchHit hit:hits){
                System.out.println(hit.getSourceAsString());
            }
        }
    

    执行成功后返回的结果信息

    2021-11-02 16:55:53.075  INFO 5529 --- [           main] c.h.s.c.ESQueryTest                      : 全量查询返回的结果数量:1 hits
    {"name":"lisi","age":30,"sex":"女","birthday":"2021-10-22"}
    

    image-20211102165659317

    5.7 范围查找

        @Test
        public void testRangeQuery() throws IOException {
    
            SearchRequest request =new SearchRequest();
            request.indices("user");
            SearchSourceBuilder builder = new SearchSourceBuilder();
            RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
            //大于等于
            rangeQuery.gte(20);
            //小于等于
            rangeQuery.lte(40);
            builder.query(rangeQuery);
            request.source(builder);
            SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
            SearchHits hits = response.getHits();
            log.info("全量查询返回的结果数量:{}",hits.getTotalHits());
            for(SearchHit hit:hits){
                System.out.println(hit.getSourceAsString());
            }
    
        }
    

    执行成功后返回的结果信息

    2021-11-02 17:00:28.992  INFO 5596 --- [           main] c.h.s.c.ESQueryTest                      : 全量查询返回的结果数量:4 hits
    {"name":"lisi","age":30,"sex":"女","birthday":"2021-10-22"}
    {"name":"wangwu1","age":40,"sex":"男","birthday":"2021-10-21"}
    {"name":"wangwu2","age":20,"sex":"女","birthday":"2021-10-20"}
    {"name":"wangwu4","age":20,"sex":"男","birthday":"2021-10-19"}
    

    image-20211102170140771

    5.8 模糊搜索

        @Test
        public void testFuzzyQuery() throws IOException {
            SearchRequest request =new SearchRequest();
            request.indices("user");
            SearchSourceBuilder builder = new SearchSourceBuilder();
    
            //Fuzziness.TWO 偏差wangwu的距离
            builder.query( QueryBuilders.fuzzyQuery("name","wangwu").fuzziness(Fuzziness.ONE));
            request.source(builder);
            SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
            SearchHits hits = response.getHits();
            log.info("查询返回的结果数量:{}",hits.getTotalHits());
            for(SearchHit hit:hits){
                System.out.println(hit.getSourceAsString());
            }
        }
    

    执行成功后返回的结果信息

    2021-11-02 17:03:12.249  INFO 5628 --- [           main] c.h.s.c.ESQueryTest                      : 查询返回的结果数量:4 hits
    {"name":"wangwu1","age":40,"sex":"男","birthday":"2021-10-21"}
    {"name":"wangwu2","age":20,"sex":"女","birthday":"2021-10-20"}
    {"name":"wangwu3","age":50,"sex":"男","birthday":"2022-10-23"}
    {"name":"wangwu4","age":20,"sex":"男","birthday":"2021-10-19"}
    

    5.9 高亮查询

        @Test
        public void testQuery() throws IOException {
            SearchRequest request =new SearchRequest();
            request.indices("user");
            SearchSourceBuilder builder = new SearchSourceBuilder();
            //构建查询方式:高亮查询
            TermsQueryBuilder termsQueryBuilder =
                    QueryBuilders.termsQuery("name","zhangsan");
            //设置查询方式
            builder.query(termsQueryBuilder);
    
            //构建高亮字段
            HighlightBuilder highlightBuilder = new HighlightBuilder();
            highlightBuilder.preTags("<font color='red'>");//设置标签前缀
            highlightBuilder.postTags("</font>");//设置标签后缀
            highlightBuilder.field("name");//设置高亮字段
    
            //设置高亮构建对象
            builder.highlighter(highlightBuilder);
            //设置请求体
            request.source(builder);
            //3.客户端发送请求,获取响应对象
            SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
            //4.打印响应结果
            SearchHits hits = response.getHits();
            System.out.println("took::"+response.getTook());
            System.out.println("time_out::"+response.isTimedOut());
            System.out.println("total::"+hits.getTotalHits());
            System.out.println("max_score::"+hits.getMaxScore());
            System.out.println("hits::::>>");
            for (SearchHit hit : hits) {
                String sourceAsString = hit.getSourceAsString();
                System.out.println(sourceAsString);
                //打印高亮结果
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();
                System.out.println(highlightFields);
            }
            System.out.println("<<::::");
        }
    
    took::3ms
    time_out::false
    total::1 hits
    max_score::1.0
    hits::::>>
    {"name":"zhangsan","age":10,"sex":"女","birthday":"2021-10-23"}
    {name=[name], fragments[[<font color='red'>zhangsan</font>]]}
    <<::::
    

    5.10 聚合查询

    • max
        @Test
        public void testAggregateQuery() throws IOException {
            SearchRequest request = new SearchRequest().indices("user");
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));
            //设置请求体
            request.source(sourceBuilder);
            //3.客户端发送请求,获取响应对象
            SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
            //4.打印响应结果
            SearchHits hits = response.getHits();
            log.info("查询返回的结果数量:{}",hits.getTotalHits());
            for(SearchHit hit:hits){
                System.out.println(hit.getSourceAsString());
            }
        }
    

    执行成功返回的结果

    {"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":6,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"user","_type":"_doc","_id":"1001","_score":1.0,"_source":{"name":"zhangsan","age":10,"sex":"女","birthday":"2021-10-23"}},{"_index":"user","_type":"_doc","_id":"1002","_score":1.0,"_source":{"name":"lisi","age":30,"sex":"女","birthday":"2021-10-22"}},{"_index":"user","_type":"_doc","_id":"1003","_score":1.0,"_source":{"name":"wangwu1","age":40,"sex":"男","birthday":"2021-10-21"}},{"_index":"user","_type":"_doc","_id":"1004","_score":1.0,"_source":{"name":"wangwu2","age":20,"sex":"女","birthday":"2021-10-20"}},{"_index":"user","_type":"_doc","_id":"1005","_score":1.0,"_source":{"name":"wangwu3","age":50,"sex":"男","birthday":"2022-10-23"}},{"_index":"user","_type":"_doc","_id":"1006","_score":1.0,"_source":{"name":"wangwu4","age":20,"sex":"男","birthday":"2021-10-19"}}]},"aggregations":{"max#maxAge":{"value":50.0}}}
    
    

    可以看到"aggregations":{"max#maxAge":{"value":50.0}}

    • 条件分组

          @Test
          public void testGroupSearch() throws IOException {
              SearchRequest request = new SearchRequest("user");
              SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
              sourceBuilder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));
              //设置请求体
              request.source(sourceBuilder);
              //3.客户端发送请求,获取响应对象
              SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
              log.info("查询返回的结果{}", JSON.toJSONString(response));
          }
      

      执行成功返回的结果

      2021-11-02 17:14:35.396  INFO 5771 --- [           main] c.h.s.c.ESQueryTest                      : 查询返回的结果{"aggregations":{"asMap":{"age_groupby":{"buckets":[{"aggregations":{"asMap":{},"fragment":true},"docCount":2,"docCountError":0,"fragment":true,"key":20,"keyAsNumber":20,"keyAsString":"20"},{"aggregations":{"asMap":{},"fragment":true},"docCount":1,"docCountError":0,"fragment":true,"key":10,"keyAsNumber":10,"keyAsString":"10"},{"aggregations":{"asMap":{},"fragment":true},"docCount":1,"docCountError":0,"fragment":true,"key":30,"keyAsNumber":30,"keyAsString":"30"},{"aggregations":{"asMap":{},"fragment":true},"docCount":1,"docCountError":0,"fragment":true,"key":40,"keyAsNumber":40,"keyAsString":"40"},{"aggregations":{"asMap":{},"fragment":true},"docCount":1,"docCountError":0,"fragment":true,"key":50,"keyAsNumber":50,"keyAsString":"50"}],"docCountError":0,"fragment":true,"name":"age_groupby","sumOfOtherDocCounts":0,"type":"lterms"}},"fragment":true},"clusters":{"fragment":true,"skipped":0,"successful":0,"total":0},"failedShards":0,"fragment":false,"hits":{"fragment":true,"hits":[{"fields":{},"fragment":false,"highlightFields":{},"id":"1001","matchedQueries":[],"primaryTerm":0,"rawSortValues":[],"score":1.0,"seqNo":-2,"sortValues":[],"sourceAsMap":{"birthday":"2021-10-23","sex":"女","name":"zhangsan","age":10},"sourceAsString":"{"name":"zhangsan","age":10,"sex":"女","birthday":"2021-10-23"}","sourceRef":{"fragment":true},"type":"_doc","version":-1},{"fields":{},"fragment":false,"highlightFields":{},"id":"1002","matchedQueries":[],"primaryTerm":0,"rawSortValues":[],"score":1.0,"seqNo":-2,"sortValues":[],"sourceAsMap":{"birthday":"2021-10-22","sex":"女","name":"lisi","age":30},"sourceAsString":"{"name":"lisi","age":30,"sex":"女","birthday":"2021-10-22"}","sourceRef":{"fragment":true},"type":"_doc","version":-1},{"fields":{},"fragment":false,"highlightFields":{},"id":"1003","matchedQueries":[],"primaryTerm":0,"rawSortValues":[],"score":1.0,"seqNo":-2,"sortValues":[],"sourceAsMap":{"birthday":"2021-10-21","sex":"男","name":"wangwu1","age":40},"sourceAsString":"{"name":"wangwu1","age":40,"sex":"男","birthday":"2021-10-21"}","sourceRef":{"fragment":true},"type":"_doc","version":-1},{"fields":{},"fragment":false,"highlightFields":{},"id":"1004","matchedQueries":[],"primaryTerm":0,"rawSortValues":[],"score":1.0,"seqNo":-2,"sortValues":[],"sourceAsMap":{"birthday":"2021-10-20","sex":"女","name":"wangwu2","age":20},"sourceAsString":"{"name":"wangwu2","age":20,"sex":"女","birthday":"2021-10-20"}","sourceRef":{"fragment":true},"type":"_doc","version":-1},{"fields":{},"fragment":false,"highlightFields":{},"id":"1005","matchedQueries":[],"primaryTerm":0,"rawSortValues":[],"score":1.0,"seqNo":-2,"sortValues":[],"sourceAsMap":{"birthday":"2022-10-23","sex":"男","name":"wangwu3","age":50},"sourceAsString":"{"name":"wangwu3","age":50,"sex":"男","birthday":"2022-10-23"}","sourceRef":{"fragment":true},"type":"_doc","version":-1},{"fields":{},"fragment":false,"highlightFields":{},"id":"1006","matchedQueries":[],"primaryTerm":0,"rawSortValues":[],"score":1.0,"seqNo":-2,"sortValues":[],"sourceAsMap":{"birthday":"2021-10-19","sex":"男","name":"wangwu4","age":20},"sourceAsString":"{"name":"wangwu4","age":20,"sex":"男","birthday":"2021-10-19"}","sourceRef":{"fragment":true},"type":"_doc","version":-1}],"maxScore":1.0,"totalHits":{"relation":"EQUAL_TO","value":6}},"numReducePhases":1,"profileResults":{},"shardFailures":[],"skippedShards":0,"successfulShards":1,"timedOut":false,"took":{"days":0,"daysFrac":9.259259259259259E-8,"hours":0,"hoursFrac":2.222222222222222E-6,"micros":8000,"microsFrac":8000.0,"millis":8,"millisFrac":8.0,"minutes":0,"minutesFrac":1.3333333333333334E-4,"nanos":8000000,"seconds":0,"secondsFrac":0.008,"stringRep":"8ms"},"totalShards":1
      

    将查询到的信息格式化后可以看到group_by之后的信息

    image-20211102171906536

  • 相关阅读:
    分布式系统笔记
    Paxos算法细节详解(一)
    Java G1学习笔记
    Spring Boot 的 10 个核心模块
    k8s 重点
    毕玄:阿里十年,从分布式到云时代的架构演进之路
    netty原理解析
    JVM调优总结(一):基本概念
    《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor
    Oracle 检查表空间使用情况
  • 原文地址:https://www.cnblogs.com/shine-rainbow/p/15500048.html
Copyright © 2011-2022 走看看