前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch6.6.x 版本的学习(二)springboot项目整合高级客户端elasticsearch-rest-high-level-client

Elasticsearch6.6.x 版本的学习(二)springboot项目整合高级客户端elasticsearch-rest-high-level-client

作者头像
一写代码就开心
发布2021-09-26 11:03:40
2.6K0
发布2021-09-26 11:03:40
举报
文章被收录于专栏:java和python

目录

官网学习地址

代码语言:javascript
复制
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.6/java-rest-high.html
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

搭建项目

创建一个springboot的maven的项目 导入依赖

代码语言:javascript
复制
     <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.6.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.6.2</version>
        </dependency>

第一个测试代码

代码语言:javascript
复制
    @Test
    public void contextLoads() throws IOException {
//        创建和es的连接
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")
                        //,new HttpHost("localhost", 9200, "http")
                        ));
//     创建一个请求
        GetRequest getRequest = new GetRequest(
                "test5",
                "doc",
                "1");

//        判断是否存在一个文档
        boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);

        System.out.println(exists);
        client.close();

    }
在这里插入图片描述
在这里插入图片描述

查询SearchRequest

入门案例

代码语言:javascript
复制
    @Test
    public void contextLoads() throws IOException {
//        创建和es的连接
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")
                        //,new HttpHost("localhost", 9200, "http")
                        ));




//        查询


//        创建一个查询请求对象
        SearchRequest searchRequest = new SearchRequest();

//        创建查询条件的对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 查询全部的数据
        // searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        //  按照条件进行查询
        searchSourceBuilder.query(QueryBuilders.termQuery("name","hong"));

//        将查询对象放到请求对象里面
        searchRequest.source(searchSourceBuilder);
//     设置请求的索引
        searchRequest.indices("test3");
//        设置请求的类型
        searchRequest.types("_doc");
//        设置查询类型
        searchRequest.searchType(SearchType.QUERY_THEN_FETCH);

//        进行查询
        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        //      获取返回的数据并且打印
        SearchHits hits = search.getHits();
        //        得到数据的个数
        System.out.println(hits.getTotalHits());

        client.close();

    }
}

QueryBuilders里面的方法

首先存入一条数据 i like eating and kuing 默认分词器应该将内容分为 “i” “like” “eating” “and” “kuing”

must,mustNot,should

代码语言:javascript
复制
must(QueryBuilders) :   AND
mustNot(QueryBuilders): NOT
should:                  : OR
代码语言:javascript
复制
@Test
    public void testQueryBuilder2() {
        QueryBuilder queryBuilder = QueryBuilders.boolQuery()
            .must(QueryBuilders.termQuery("user", "kimchy"))
            .mustNot(QueryBuilders.termQuery("message", "nihao"))
            .should(QueryBuilders.termQuery("gender", "male"));
        searchFunction(queryBuilder);
    }

matchQuery

代码语言:javascript
复制
QueryBuilders.matchQuery(“supplierName”,param)
会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。
param = “i” 可查出i
param = “i li” 可查出
param = “i like” 可查出
param = “i like eat” 可查出
param = “and” 可查出
param = “kuing” 可查出

分页 from size

在这里插入图片描述
在这里插入图片描述

先查询出符合条件的所有的数据之后再分页

代码语言:javascript
复制
  searchSourceBuilder
  .query(QueryBuilders.matchAllQuery())
  .from(0).size(2);

matchAllQuery

将索引里面的东西都查询出来

代码语言:javascript
复制
  searchSourceBuilder.query(QueryBuilders.matchAllQuery())

sort

排序

就是将数据查询出来之后,可以进行分页,可以进行排序

代码语言:javascript
复制
   searchSourceBuilder
                 .query(QueryBuilders.matchAllQuery())
                 .from(0)
                 .size(3)
         .sort("age", SortOrder.ASC);

filter

过滤

代码语言:javascript
复制
   searchSourceBuilder
                 .query(QueryBuilders.matchAllQuery())
                 .from(0)
                 .size(3)
         .sort("age", SortOrder.ASC)
         .postFilter(QueryBuilders.rangeQuery("age").from(30).to(31));

explain

安装匹配度进行查询,就是每条数据的得分,得分越高,越可以查询出来

代码语言:javascript
复制
    searchSourceBuilder
                 .query(QueryBuilders.matchAllQuery())
                 .from(0)
                 .size(3)
         .sort("age", SortOrder.ASC)
         .postFilter(QueryBuilders.rangeQuery("age").from(30).to(31))

.explain(true);

multiMatchQuery

multiMatchQuery(“text”, “field1”, “field2”…); 匹配多个字段, field有通配符忒行

我们要查询的值不知道在哪个字段,所以需要多字段进行匹配,只要有一个字段符合条件,那么就可以匹配出来了

代码语言:javascript
复制
  searchSourceBuilder
                 .query(QueryBuilders.multiMatchQuery("jing","name","age"))
                 .from(0)
                 .size(3)
         .sort("age", SortOrder.ASC)
         .postFilter(QueryBuilders.rangeQuery("age").from(30).to(31))
         .explain(true);

queryStringQuery

根据值去每个字段进行模糊查询 +代表必须含有 -代表不能含有

代码语言:javascript
复制
    //查询文档中含必须含有changge,不含有hejiu的文档(会每个字段去查询)+代表必须含有  -代表不能含有
    QueryBuilder builder = QueryBuilders.queryStringQuery("+changge  -hejiu");

可以按特定的字段进行模糊查询

代码语言:javascript
复制
         searchSourceBuilder
         .query(QueryBuilders.queryStringQuery("name:tome*"))

CommonTersQuery

指定字段进行模糊查询

代码语言:javascript
复制
 QueryBuilder builder = 
 QueryBuilders.commonTermsQuery("name","jing");

simpleQueryStringQuery

说明:根据值去每个字段进行模糊查询 只要有一个符合就会返回该文章

代码语言:javascript
复制
   //只要所有字段中,含有changge或hejiui的都返回
    QueryBuilder builder = 
    QueryBuilders.simpleQueryStringQuery("jing");

termQuery

精准匹配

字段的值必须是这个才可以查询出来

代码语言:javascript
复制
searchSourceBuilder.query(QueryBuilders.termQuery("name","hong"));

聚合

在ES里面所有的聚合实例都由AggregationBuilders类提供静态方法构造,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
(1)统计某个字段的数量
  ValueCountBuilder vcb=  AggregationBuilders.count("count_uid").field("uid");
(2)去重统计某个字段的数量(有少量误差)
 CardinalityBuilder cb= AggregationBuilders.cardinality("distinct_count_uid").field("uid");
(3)聚合过滤
FilterAggregationBuilder fab= AggregationBuilders.filter("uid_filter").filter(QueryBuilders.queryStringQuery("uid:001"));
(4)按某个字段分组
TermsBuilder tb=  AggregationBuilders.terms("group_name").field("name");
(5)求和
SumBuilder  sumBuilder=	AggregationBuilders.sum("sum_price").field("price");
(6)求平均
AvgBuilder ab= AggregationBuilders.avg("avg_price").field("price");
(7)求最大值
MaxBuilder mb= AggregationBuilders.max("max_price").field("price"); 
(8)求最小值
MinBuilder min=	AggregationBuilders.min("min_price").field("price");
(9)按日期间隔分组
DateHistogramBuilder dhb= AggregationBuilders.dateHistogram("dh").field("date");
(10)获取聚合里面的结果
TopHitsBuilder thb=  AggregationBuilders.topHits("top_result");
(11)嵌套的聚合
NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");
(12)反转嵌套
AggregationBuilders.reverseNested("res_negsted").path("kps ");

aggregation

searchSourceBuilder对象里面有一个方法aggregation() 参数是聚合函数对象

分组之后的个数

代码语言:javascript
复制
先按照查询条件查询出数据,之后再进行聚合查询



//        创建查询条件的对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        TermsAggregationBuilder aggration = AggregationBuilders.terms("by_age").field("age");
        searchSourceBuilder
//                 .query(QueryBuilders.multiMatchQuery("jing","name","age"))
                .query(QueryBuilders.matchAllQuery())
                .aggregation(aggration);

聚合分组之后,获取分组的个数

代码语言:javascript
复制
//        进行查询
        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);

//        根据分组的名字进行获取,获取分组聚合之后的信息
        Terms terms = search.getAggregations().get("by_age");
        for(Terms.Bucket  entity:terms.getBuckets()){
            Object key = entity.getKey();
            long docCount = entity.getDocCount();
            System.out.println(key+"@"+docCount);
        }

分组之后的总成绩

在这里插入图片描述
在这里插入图片描述

以下是按名字进行分组,之后计算分组之后的每个人分数的和

代码语言:javascript
复制
//        创建查询条件的对象
        SearchSourceBuilder searchSourceBuilder = 
        new SearchSourceBuilder();

//        按名字进行分组
        TermsAggregationBuilder nameaggration = 
        AggregationBuilders.terms("by_name").field("name");
//        按分数进行求和
        SumAggregationBuilder field = 
        AggregationBuilders.sum("by_score").field("score");
将两个聚合对象连起来
        nameaggration.subAggregation(field);
        
        searchSourceBuilder
//                 .query(QueryBuilders.multiMatchQuery("jing","name","age"))
                .query(QueryBuilders.matchAllQuery())
                .aggregation(nameaggration);

获取结果,也就是获取每个人的成绩和

代码语言:javascript
复制
//        进行查询
        SearchResponse search = 
        client.search(searchRequest, RequestOptions.DEFAULT);


        Terms nameterms = search.getAggregations().get("by_name");

        for(Terms.Bucket  entity:nameterms.getBuckets()){
            Sum sum = entity.getAggregations().get("by_age");
            System.out.println("和:"+sum);
        }

多索引,多类型查询

代码语言:javascript
复制
//        将查询对象放到请求对象里面
        searchRequest.source(searchSourceBuilder);


//     设置请求的索引,以下两种方法都可以
        searchRequest.indices("test3","test2");
        searchRequest.indices("test*");

//        设置请求的类型
        searchRequest.types("_doc","class");
        searchRequest.types("_doc*");
//        设置查询类型
        searchRequest.searchType(SearchType.QUERY_THEN_FETCH);

极数查询

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 官网学习地址
  • 搭建项目
    • 第一个测试代码
    • 查询SearchRequest
      • 入门案例
        • QueryBuilders里面的方法
          • must,mustNot,should
        • matchQuery
          • 分页 from size
            • matchAllQuery
              • sort
                • filter
                  • explain
                    • multiMatchQuery
                      • queryStringQuery
                        • CommonTersQuery
                          • simpleQueryStringQuery
                            • termQuery
                            • 聚合
                              • aggregation
                                • 分组之后的个数
                                • 分组之后的总成绩
                            • 多索引,多类型查询
                            • 极数查询
                            相关产品与服务
                            Elasticsearch Service
                            腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档