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()); } }



浙公网安备 33010602011771号