开心一笑: 会买水果的狗狗

    关注微信公众号

    QQ群:831045818

    app下载

    当前位置:首页> java > 技术文档 > 正文
    ElasticSearch
    发布时间:2023-02-22 16:54:28.0 浏览次数:

    在之前的文章中, 我们详细的介绍了 ElasticSearch 的安装与使用,详细大家对 ElasticSearch 有了初步的认识。

    本文将重点介绍 SpringBoot 整合 ElasticSearch 做搜索引擎,实现亿量级数据的快速查询。

    废话不多说,直接上代码!

    二、代码实践

    本文采用的SpringBoot版本号是2.1.0.RELEASE,服务端 es 的版本号是6.8.2,客户端采用的是官方推荐的Elastic Java High Level Rest Client版本号是6.8.2,方便与SpringBoot的版本兼容。

    es 最大的亮点就是查询非常丰富,可以在上亿的数据里面快速搜索出目标数据,查询如果实现呢?请看下文

    • 单条件精确查询

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes=ElasticSearchApplication.class)
    publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;
    /***单条件精确查询*@throwsIOException*/
    @Testpublicvoidsearch0()throwsIOException{
    //创建请求
    SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.termsQuery("name","赵里"));
    //搜索
    SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");
    searchRequest.types("_doc");searchRequest.source(builder);
    //执行请求
    SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);
    //解析查询结果
    System.out.println(response.toString());
    }
    }
    • 多条件精确查询,取并集

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes=ElasticSearchApplication.class)
    publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;
    /***多条件精确查询,取并集*@throwsIOException*/
    @Testpublicvoidsearch1()throwsIOException{
    //创建请求
    SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.termsQuery("name","张","陈"));
    //搜索
    SearchRequestsearchRequest=newSearchRequest();
    searchRequest.indices("cs_index");
    searchRequest.types("_doc");
    searchRequest.source(builder);
    //执行请求
    SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);
    //解析查询结果
    System.out.println(response.toString());}}
    • 范围查询

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes=ElasticSearchApplication.class)
    publicclassSearchJunit{
        @AutowiredprivateRestHighLevelClientclient;/***范围查询,包括from、to*@throwsIOException*/
        @Testpublicvoidsearch2()throwsIOException{
        //创建请求
        SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.rangeQuery("age").from(20).to(32));
        //搜索
        SearchRequestsearchRequest=newSearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        //执行请求
        SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);
        //解析查询结果
        System.out.println(response.toString());
    }
    /***范围查询,不包括from、to*@throwsIOException*/
    @Testpublicvoidsearch3()throwsIOException{
    //创建请求
    SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.rangeQuery("age").from(20,false).to(30,false));
    //搜索
    SearchRequestsearchRequest=newSearchRequest();
    searchRequest.indices("cs_index");
    searchRequest.types("_doc");
    searchRequest.source(builder);
    //执行请求
    SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);
    //解析查询结果
    System.out.println(response.toString());
    }
    /***范围查询,lt:小于,gt:大于*@throwsIOException*/
    @Testpublicvoidsearch4()throwsIOException{
    //创建请求
    SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.rangeQuery("age").lt(30).gt(20));
    //搜索
    SearchRequestsearchRequest=newSearchRequest();
    searchRequest.indices("cs_index");
    searchRequest.types("_doc");searchRequest.source(builder);
    //执行请求
    SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);
    //解析查询结果
    System.out.println(response.toString());
    }}
    • 模糊查询,支持通配符

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***模糊查询,支持通配符*@throwsIOException*/@Testpublicvoidsearch5()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.wildcardQuery("name","张三"));//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 不使用通配符的模糊查询,左右匹配

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***不使用通配符的模糊查询,左右匹配*@throwsIOException*/@Testpublicvoidsearch6()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.queryStringQuery("张三").field("name"));//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 多字段模糊查询

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***多字段模糊查询*@throwsIOException*/@Testpublicvoidsearch7()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.multiMatchQuery("长","name","city"));//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 多字段模糊查询

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***分页搜索*@throwsIOException*/@Testpublicvoidsearch8()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder().from(0).size(2);//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 字段排序

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***排序,字段的类型必须是:integer、double、long或者keyword*@throwsIOException*/@Testpublicvoidsearch9()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder().sort("createTime",SortOrder.ASC);//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 精确统计筛选文档数

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***精确统计筛选文档数,查询性能有所降低*@throwsIOException*/@Testpublicvoidsearch10()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder().trackTotalHits(true);//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 设置源字段过滤返回

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段*@throwsIOException*/@Testpublicvoidsearch11()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder().fetchSource(newString[]{"name","age","city","createTime"},newString[]{});//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 根据 id 精确匹配

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***根据id精确匹配*@throwsIOException*/@Testpublicvoidsearch12()throwsIOException{String[]ids=newString[]{"1","2"};//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.termsQuery("_id",ids));//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • matchAllQuery 搜索全部

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***matchAllQuery搜索全部*@throwsIOException*/@Testpublicvoidsearch21()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.matchAllQuery());//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • match 搜索匹配

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***match搜索匹配*@throwsIOException*/@Testpublicvoidsearch22()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder().query(QueryBuilders.matchQuery("name","张王"));//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • bool组合查询

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***bool组合查询*@throwsIOException*/@Testpublicvoidsearch23()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder();BoolQueryBuilderboolQueryBuilder=newBoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.matchQuery("name","张王"));boolQueryBuilder.must(QueryBuilders.rangeQuery("age").lte(30).gte(20));builder.query(boolQueryBuilder);//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • nested 类型嵌套查询

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***nested类型嵌套查询*@throwsIOException*/@Testpublicvoidsearch24()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder();//条件查询BoolQueryBuildermainBool=newBoolQueryBuilder();mainBool.must(QueryBuilders.matchQuery("name","赵六"));//nested类型嵌套查询BoolQueryBuilderboolQueryBuilder=newBoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.matchQuery("products.brand","A"));boolQueryBuilder.must(QueryBuilders.matchQuery("products.title","巧克力"));NestedQueryBuildernested=QueryBuilders.nestedQuery("products",boolQueryBuilder,ScoreMode.None);mainBool.must(nested);builder.query(mainBool);//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 多条件查询 + 排序 + 分页

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***多条件查询+排序+分页*@throwsIOException*/@Testpublicvoidsearch29()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder();//条件搜索BoolQueryBuilderboolQueryBuilder=newBoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.matchQuery("name","张王"));boolQueryBuilder.must(QueryBuilders.rangeQuery("age").lte(30).gte(20));builder.query(boolQueryBuilder);//结果集合分页builder.from(0).size(2);//排序builder.sort("createTime",SortOrder.ASC);//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 聚合查询-求和

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***聚合查询sum*@throwsIOException*/@Testpublicvoidsearch30()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilderaggregation=AggregationBuilders.sum("sum_age").field("age");builder.aggregation(aggregation);//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 聚合查询-求平均值

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***聚合查询avg*@throwsIOException*/@Testpublicvoidsearch31()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilderaggregation=AggregationBuilders.avg("avg_age").field("age");builder.aggregation(aggregation);//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 聚合查询-计数

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***聚合查询count*@throwsIOException*/@Testpublicvoidsearch32()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilderaggregation=AggregationBuilders.count("count_age").field("age");builder.aggregation(aggregation);//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}
    • 聚合查询-分组

    @RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes=ElasticSearchApplication.class)publicclassSearchJunit{@AutowiredprivateRestHighLevelClientclient;/***聚合查询分组*@throwsIOException*/@Testpublicvoidsearch33()throwsIOException{//创建请求SearchSourceBuilderbuilder=newSearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilderaggregation=AggregationBuilders.terms("tag_createTime").field("createTime").subAggregation(AggregationBuilders.count("count_age").field("age"))//计数.subAggregation(AggregationBuilders.sum("sum_age").field("age"))//求和.subAggregation(AggregationBuilders.avg("avg_age").field("age"));//求平均值builder.aggregation(aggregation);//不输出原始数据builder.size(0);//搜索SearchRequestsearchRequest=newSearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);//执行请求SearchResponseresponse=client.search(searchRequest,RequestOptions.DEFAULT);//解析查询结果System.out.println(response.toString());}}


    关注"都市百货" 了解南陵

    微信咨询wanglf2r(不拉群 发广告者勿加)

    0
    0
    上一篇:必须参数检查 上一篇:optional使用

    评论已有0

    提交评论

    热门评论

    南陵新闻
    公示公告
    常用查询
    风光南陵
    走出南陵
    友情链接