一、創建表結構:
二、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()); } }