ES练习---各种查询方式
一、创建表结构:
二、ES的各种查询
2.1term&terms查询
2.1.1term查询(我试了下province没有办法查询,需到后面加个.keyword)
package com.qf.test; import com.fasterxml.jackson.databind.ObjectMapper; import com.qf.utils.ESClient; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.junit.Test; import java.io.IOException; import java.util.Map; public class Demo4 { ObjectMapper mapper=new ObjectMapper(); RestHighLevelClient client = ESClient.getClient(); String index="sms-logs-index"; String type="sms-logs-type"; @Test public void termQuery() throws IOException { //1.创建request对象 SearchRequest searchRequest=new SearchRequest(index); searchRequest.types(type); //2.指定查询条件 SearchSourceBuilder builder=new SearchSourceBuilder(); builder.from(0); builder.size(5); builder.query(QueryBuilders.termQuery("province.keyword","北京")); searchRequest.source(builder); //执行查询 SearchResponse rsp=client.search(searchRequest, RequestOptions.DEFAULT); //输出结果 for (SearchHit hit:rsp.getHits().getHits()) { Map<String,Object> result=hit.getSourceAsMap(); System.out.println(result); } } }
2.1.2terms查询
POST /sms-logs-index/sms-logs-type/_search { "from": 0, "size": 5, "query":{ "terms":{ "province.keyword":[ "江苏", "北京", "南通" ] } } }
@Test public void termsQuerry() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.termsQuery("province.keyword","南通","江苏")); request.source(builder);; SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); //输出结果 for (SearchHit hit:rsp.getHits().getHits()) { Map<String,Object> result=hit.getSourceAsMap(); System.out.println(result); } }}
2.2match_all&match查询
2.2.1match_all
POST /sms-logs-index/sms-logs-type/_search { "query": { "match_all": {} } }
注:ES默认查询10条数据
@Test public void matchAllQuery() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.matchAllQuery()); builder.size(20);//ES默认查询10条数据 request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit: rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }
2.2.2match查询
POST /sms-logs-index/sms-logs-type/_search { "query": { "match": { "smsContent": "恭喜" } } }
@Test public void matchQuery() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.matchQuery("smsContent","恭喜")); builder.size(20);//ES默认查询10条数据 request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit: rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }
2.2.3布尔match查询
public void booleanMatchQuery() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.matchQuery("smsContent","恭喜 高级").operator(Operator.AND)); builder.size(20);//ES默认查询10条数据 request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit: rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }
2.2.4mulitMatch查询
@Test public void mulitMatchQuery() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.multiMatchQuery("北京","province","smsContent")); builder.size(20);//ES默认查询10条数据 request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit: rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }
2.3id&ids查询
2.3.1id查询
@Test public void findByid() throws IOException { GetRequest request=new GetRequest(index,type,"1"); GetResponse rsp=client.get(request, RequestOptions.DEFAULT); System.out.println(rsp.getSourceAsMap()); }
2.3.2ids查询
@Test public void findByids() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.idsQuery().addIds("1","2","3")); request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit: rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }
2.4prefix查询
@Test public void findByPrefix() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.prefixQuery("corpName","恭喜")); request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit: rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }
2.5fuzzy查询
@Test public void findByfuzzy() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.fuzzyQuery("corpName","恭喜您").prefixLength(2)); request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit: rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }
2.6wildcard查询
@Test public void findByWildcard() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.wildcardQuery("corpName","恭喜*")); request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit: rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }
2.7range查询
@Test public void findByrange() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.rangeQuery("fee").gte(5).lte(10)); builder.size(20);//ES默认查询10条数据 request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit: rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }
2.7regexp查询
@Test public void findByRegexp() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder=new SearchSourceBuilder(); builder.query(QueryBuilders.regexpQuery("mobile","123[0-9]{8}")); builder.size(20);//ES默认查询10条数据 request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit: rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }
2.8深分页Scroll
package com.qf.test; import com.fasterxml.jackson.databind.ObjectMapper; import com.qf.utils.ESClient; import org.elasticsearch.action.search.*; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.Scroll; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortOrder; import org.junit.Test; import java.io.IOException; public class Demo7 { ObjectMapper mapper=new ObjectMapper(); RestHighLevelClient client = ESClient.getClient(); String index="sms-logs-index"; String type="sms-logs-type"; @Test public void scrollQuery() throws IOException { //1.创建SearchRrequest对象 SearchRequest request = new SearchRequest(index); request.types(type); //2.指定scroll信息 request.scroll(TimeValue.timeValueMinutes(1L)); //3.指定查询条件 SearchSourceBuilder builder=new SearchSourceBuilder(); builder.size(4); builder.sort("fee", SortOrder.DESC); builder.query(QueryBuilders.matchAllQuery()); request.source(builder); //4.获取返回结果scrollId,source SearchResponse rsp= client.search(request, RequestOptions.DEFAULT); String scrollId=rsp.getScrollId(); System.out.println("---------首页--------"); for (SearchHit hit:rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } //5.循环/创建SearchScrollRequest while(true) { SearchScrollRequest searchScrollRequest=new SearchScrollRequest(scrollId); //6.指定scrollId生存时间 searchScrollRequest.scroll(TimeValue.timeValueMinutes(1L)); //7.执行查询返回的结果 SearchResponse scrollRsp=client.scroll(searchScrollRequest,RequestOptions.DEFAULT); //8.判断是否查询到了数据,输出 SearchHit[] hits =scrollRsp.getHits().getHits(); if (hits!=null&& hits.length >0){ System.out.println("----------下一页------------"); for (SearchHit hit:rsp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } }else{ //9.判断没有查询到的数据-退出循环 System.out.println("-------------结束-------------"); break; } } //10.创建ClearScrollRequest ClearScrollRequest clearScrollRequest=new ClearScrollRequest(); //11.指定scrollId clearScrollRequest.addScrollId(scrollId); //12.删除scrollId ClearScrollResponse clearScrollResponse= client.clearScroll(clearScrollRequest,RequestOptions.DEFAULT); //13输出结果 System.out.println("删除scrollId:" +clearScrollResponse.isSucceeded()); } }
2.9delete-by-query
@Test public void deleteByQuery() throws IOException { //1.创建deleteByQueryRequest DeleteByQueryRequest request=new DeleteByQueryRequest(index); request.types(type); //2.指定索引的条件(和SearchRequest指定query方式不一样) request.setQuery(QueryBuilders.rangeQuery("fee").lt(6)); //3.执行删除 BulkByScrollResponse resp =client.deleteByQuery(request, RequestOptions.DEFAULT); //4.返回结果 System.out.println(resp.toString()); }
3.0复合查询
3.0.1bool查询
POST /sms-logs-index/sms-logs-type/_search { "query":{ "bool":{ "should": [ { "term": { "province": { "value": "北京" } } }, { "term": { "province": { "value": "南通" } } } ], "must_not": [ { "term": { "operatorId": { "value": "2" } } } ], "must": [ { "match": { "smsContent": "恭喜" } }, { "match": { "smsContent": "黑卡" } } ] } } }
@Test public void boolQuery() throws IOException { //1.创建SearchRequest SearchRequest request=new SearchRequest(index); request.types(type); //2.查询条件 SearchSourceBuilder builder=new SearchSourceBuilder(); BoolQueryBuilder boolQuery=QueryBuilders.boolQuery(); boolQuery.should(QueryBuilders.termQuery("province","北京")); boolQuery.should(QueryBuilders.termQuery("province","南京")); boolQuery.mustNot(QueryBuilders.termQuery("OperatorId","2")); boolQuery.must(QueryBuilders.matchQuery("smsContent","高级")); boolQuery.must(QueryBuilders.matchQuery("smsContent","黑卡")); builder.query(boolQuery); request.source(builder); //3.查询 SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); //4.输出结果 for (SearchHit hit:rsp.getHits().getHits() ) { System.out.println(hit.getSourceAsMap()); } }
3.0.2boosting查询
@Test public void BoostingQuery() throws IOException { //1.创建SearchRequest SearchRequest request = new SearchRequest(index); request.types(type); //2.查询条件 SearchSourceBuilder builder = new SearchSourceBuilder(); BoostingQueryBuilder boostingQueryBuilder = QueryBuilders.boostingQuery( QueryBuilders.matchQuery("smsContent", "高级"), QueryBuilders.matchQuery("smsContent", "黑卡") ).negativeBoost(0.5f); builder.query(boostingQueryBuilder); request.source(builder); SearchResponse rsp = client.search(request, RequestOptions.DEFAULT); //4.输出结果 for (SearchHit hit : rsp.getHits().getHits() ) { System.out.println(hit.getSourceAsMap()); } }
3.1filter查询
@Test public void filter() throws IOException { //1.创建SearchRequest SearchRequest request = new SearchRequest(index); request.types(type); SearchSourceBuilder builder = new SearchSourceBuilder(); BoolQueryBuilder boolQuery= QueryBuilders.boolQuery(); boolQuery.filter(QueryBuilders.termQuery("corpName","银行")); boolQuery.filter(QueryBuilders.rangeQuery("fee").lte(8)); builder.query(boolQuery); request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); //4.输出结果 for (SearchHit hit:rsp.getHits().getHits() ) { System.out.println(hit.getSourceAsMap()); } }
3.2高亮查询
@Test public void highLightQuery() throws IOException { SearchRequest request=new SearchRequest(index); request.types(type); SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.matchQuery("smsContent","黑卡")); //指定高亮 HighlightBuilder highlightBuilder=new HighlightBuilder(); highlightBuilder.field("smsContent",10) .preTags("<font color='red>") .postTags("</font>"); builder.highlighter(highlightBuilder); request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); for (SearchHit hit:rsp.getHits().getHits() ) { System.out.println(hit.getHighlightFields().get("smsContent")); } }
3.3聚合查询
3.3.1去重计数查询(cardinality)
@Test public void cardinality() throws IOException { //1.创建SearchRequest SearchRequest request=new SearchRequest(index); request.types(type); //2.指定所用的聚合查询方式 SearchSourceBuilder builder = new SearchSourceBuilder(); builder.aggregation( AggregationBuilders.cardinality("agg").field("province")); request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); Cardinality agg=rsp.getAggregations().get("agg"); long value= agg.getValue(); System.out.println(value); }
3.3.2范围统计
@Test public void range() throws IOException { //1.创建SearchRequest SearchRequest request = new SearchRequest(index); request.types(type); //2.指定所用的聚合查询方式 SearchSourceBuilder builder = new SearchSourceBuilder(); builder.aggregation(AggregationBuilders.range("agg").field("fee") .addUnboundedTo(5) .addRange(5, 10) .addUnboundedTo(10)); request.source(builder); SearchResponse rsp = client.search(request, RequestOptions.DEFAULT); //返回结果 Range agg = rsp.getAggregations().get("agg"); for (Range.Bucket bucket : agg.getBuckets()) { String key = bucket.getKeyAsString(); Object from = bucket.getFrom(); Object to = bucket.getTo(); long docCount = bucket.getDocCount(); System.out.println(String.format("key:%s, from:%s, to:%s, docCount:%s", key, from,to,docCount )); } }
3.3.3统计聚合查询
//统计聚合查询 @Test public void extendsStates() throws IOException { //1.创建SearchRequest SearchRequest request=new SearchRequest(index); request.types(type); //2.指定所用的聚合查询方式 SearchSourceBuilder builder = new SearchSourceBuilder(); builder.aggregation( AggregationBuilders.extendedStats("agg").field("fee")); request.source(builder); SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); ExtendedStats agg=rsp.getAggregations().get("agg"); double max =agg.getMax(); double min = agg.getMin(); System.out.println("fee最大值为:"+max+",最小值为:"+min); }
3.4地图经纬度查询
3.4.1地图检索方式
3.4.2基于RESTFUL实现地图检索
3.4.3java实现geo_polygon检索
@Test public void geoPolygon() throws IOException { //1.创建SearchRequest SearchRequest request=new SearchRequest(index); request.types(type); //2.指定查询方式 SearchSourceBuilder builder = new SearchSourceBuilder(); List<GeoPoint> points=new ArrayList<>(); points.add(new GeoPoint(39.99878,116.298915)); points.add(new GeoPoint(39.972576,116.29561)); points.add(new GeoPoint(39.984739,116.327661)); builder.query(QueryBuilders.geoPolygonQuery("location",points)); request.source(builder); //3.执行查询 SearchResponse rsp=client.search(request, RequestOptions.DEFAULT); //4.输出结果 for (SearchHit hit:rsp.getHits().getHits() ) { System.out.println(hit.getSourceAsMap()); } }