Java API操作ES

摘要:
Java API运行ESElasticSearch软件,该软件由Java语言开发,因此您也可以通过Java API方法访问ElasticSearch服务——介绍spring boot test--˃org。springframework Bootspringframeworkstarter测试注意:ElasticSearch已正式声明不再推荐早期版本的客户端对象,并且将在未来版本中删除。因此,高级REST客户端对象直接用于导入的pom文件中。
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

免责声明:文章转载自《Java API操作ES》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇项目开发规范(编码规范、命名规范、安全规范、前端优化、源码提交规范、代码维护规范、产品发布规范)...mac终端命令大全介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Kibana(一张图片胜过千万行日志)

Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。 你用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互。 你可以轻松地执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。 Kibana使得理解大量数据变得很容易。它简单的、基于浏览器的界面使你能够快速创建和共享动态仪表板,实...

Geoserver的rest接口使用(后台或者前端调实现自动发布服务)

Geoserver提供许多服务的发布,我们可以通过控制台进行手动发布,至于至于如何在程序中利用代码发布服务,这如何做?可以通过两种思路进行一通过后台通过请求rest接口进行发布或者前端通过ajax,另一种通过xml方式详细的请参考该篇文章简析GeoServer服务的内部文件组织以及GeoServer自动化服务发布工具的开发思路本文主要介绍地第一种方式(ja...

PowerShell调用jira rest api实现对个人提交bug数的统计

通过PowerShell的invoke-webrequest和net.client联合实现个人指定项目jira提交数的统计,其中涉及到了JSON对象的提交,代码如下: $content = @{username='用户名';password='密码'} $JSON = $content|convertto-JSON -Compress $jiraUri...

ELK日志分析系统(4)-elasticsearch数据存储

1. 概述 logstash把格式化的数据发送到elasticsearch以后,elasticsearch负责存储搜索日志数据 elasticsearch的搜索接口还是很强大的,这边不详细展开,因为kibana会去调用el的接口; 本文将讲解elasticsearch的相关配置和遇到的问题,至于elasticsearch的相关搜索使用,后面会找个时间整理一...

ElasticSearch索引与搜索

在系列的第一篇文章中我们介绍了ElasticSearch的基本概念和操作,本文将继续介绍ElasticSearch查询和索引功能。 目录: 查询 精确查询 term查询 terms查询 range查询 全文查询 match查询 multi_match查询 script查询 组合查询 bool查询 dis_max查询 function_sc...

Django-rest-framework --- 总结

目录 drf回顾总结 drf基础知识点 1.drf框架安装 安装 drf框架规矩的封装风格 drf请求生命周期 2.接口 3.restful接口规范 4.基于restful规范的原生Django接口 主路由:url.py api组件的子路由:api/url.py 模型层:model.py 后台层:admin.py 数据库迁移 视图层:vi...