在之前的文章中, 我们详细的介绍了 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(不拉群 发广告者勿加)
热门评论