JavaSpringBootElasticsearch
这里使用的SpringBoot版本号是2.1.0.RELEASE,服务端 es 的版本号是6.8.2,客户端采用的是官方推荐的Elastic Java High Level Rest Client版本号是6.4.2,方便与SpringBoot的版本兼容。
es 最大的亮点就是查询非常丰富,可以在上亿的数据里面快速搜索出目标数据,查询如果实现呢?请看下面的内容
单条件精确查询
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 单条件精确查询* @throws IOException*/@Testpublic void search0() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.termsQuery("name", "赵里"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
多条件精确查询,取并集
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 多条件精确查询,取并集* @throws IOException*/@Testpublic void search1() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.termsQuery("name", "张", "陈"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
范围查询
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 范围查询,包括from、to* @throws IOException*/@Testpublic void search2() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.rangeQuery("age").from(20).to(32));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}/*** 范围查询,不包括from、to* @throws IOException*/@Testpublic void search3() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.rangeQuery("age").from(20,false).to(30, false));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}/*** 范围查询, lt:小于,gt:大于* @throws IOException*/@Testpublic void search4() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.rangeQuery("age").lt(30).gt(20));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
模糊查询,支持通配符
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 模糊查询,支持通配符* @throws IOException*/@Testpublic void search5() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.wildcardQuery("name","张三"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
不使用通配符的模糊查询,左右匹配
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 不使用通配符的模糊查询,左右匹配* @throws IOException*/@Testpublic void search6() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.queryStringQuery("张三").field("name"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
多字段模糊查询
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 多字段模糊查询* @throws IOException*/@Testpublic void search7() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.multiMatchQuery("长", "name", "city"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
多字段模糊查询
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 分页搜索* @throws IOException*/@Testpublic void search8() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().from(0).size(2);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
字段排序
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 排序,字段的类型必须是:integer、double、long或者keyword* @throws IOException*/@Testpublic void search9() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().sort("createTime", SortOrder.ASC);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
精确统计筛选文档数
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 精确统计筛选文档数,查询性能有所降低* @throws IOException*/@Testpublic void search10() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().trackTotalHits(true);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
设置源字段过滤返回
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段* @throws IOException*/@Testpublic void search11() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().fetchSource(new String[]{"name","age","city","createTime"},new String[]{});//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
根据 id 精确匹配
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 根据id精确匹配* @throws IOException*/@Testpublic void search12() throws IOException {String[] ids = new String[]{"1","2"};// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.termsQuery("_id", ids));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
matchAllQuery 搜索全部
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** matchAllQuery搜索全部* @throws IOException*/@Testpublic void search21() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
match 搜索匹配
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** match搜索匹配* @throws IOException*/@Testpublic void search22() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchQuery("name", "张王"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
bool组合查询
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** bool组合查询* @throws IOException*/@Testpublic void search23() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.matchQuery("name", "张王"));boolQueryBuilder.must(QueryBuilders.rangeQuery("age").lte(30).gte(20));builder.query(boolQueryBuilder);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
nested 类型嵌套查询
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** nested类型嵌套查询* @throws IOException*/@Testpublic void search24() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件查询BoolQueryBuilder mainBool=new BoolQueryBuilder();mainBool.must(QueryBuilders.matchQuery("name", "赵六"));//nested类型嵌套查询BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.matchQuery("products.brand", "A"));boolQueryBuilder.must(QueryBuilders.matchQuery("products.title", "巧克力"));NestedQueryBuilder nested = QueryBuilders.nestedQuery("products",boolQueryBuilder, ScoreMode.None);mainBool.must(nested);builder.query(mainBool);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
多条件查询 + 排序 + 分页
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 多条件查询 + 排序 + 分页* @throws IOException*/@Testpublic void search29() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件搜索BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();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);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
聚合查询-求和
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 聚合查询 sum* @throws IOException*/@Testpublic void search30() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilder aggregation = AggregationBuilders.sum("sum_age").field("age");builder.aggregation(aggregation);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
聚合查询-求平均值
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 聚合查询 avg* @throws IOException*/@Testpublic void search31() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilder aggregation = AggregationBuilders.avg("avg_age").field("age");builder.aggregation(aggregation);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
聚合查询-计数
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 聚合查询 count* @throws IOException*/@Testpublic void search32() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilder aggregation = AggregationBuilders.count("count_age").field("age");builder.aggregation(aggregation);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
聚合查询-分组
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = ElasticSearchApplication.class)public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 聚合查询 分组* @throws IOException*/@Testpublic void search33() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilder aggregation = 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);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
