Java ES api 查询例子
1 索引
1.1 创建索引
public static void main(String[] args) throws Exception { RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); // 创建索引 CreateIndexRequest request = new CreateIndexRequest("user"); CreateIndexResponse createIndexResponse = esClient.indices().create(request, RequestOptions.DEFAULT); // 响应状态 boolean acknowledged = createIndexResponse.isAcknowledged(); System.out.println("索引操作 :" + acknowledged); esClient.close(); }
1.2 查询索引
public static void main(String[] args) throws Exception { RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); // 查询索引 GetIndexRequest request = new GetIndexRequest("user"); GetIndexResponse getIndexResponse = esClient.indices().get(request, RequestOptions.DEFAULT); // 响应状态 System.out.println(getIndexResponse.getAliases()); System.out.println(getIndexResponse.getMappings()); System.out.println(getIndexResponse.getSettings()); esClient.close(); }
1.3 删除索引
public static void main(String[] args) throws Exception { RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); // 查询索引 DeleteIndexRequest request = new DeleteIndexRequest("user"); AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT); // 响应状态 System.out.println(response.isAcknowledged()); esClient.close(); }
2 查询
public void test(){ //用过设置es服务的ip,端口号和协议建立es客户端工厂 RestClientBuilder builder = RestClient.builder(new HttpHost("10.50.31.110", 9200, "http")); //建立客户端 RestHighLevelClient client = new RestHighLevelClient(builder); //设置es的索引index和类型他type SearchRequest searchRequest = new SearchRequest("data_node"); searchRequest.types("data_node"); //查询工厂 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //bool工厂,相当于sql中where条件,where之后的条件都写在这里 BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); //queryBuilder.should方法是或的逻辑,满足一个,queryBuilder.must是必须满足 queryBuilder.should(QueryBuilders.termQuery("data.name", "014")); //将where条件放入工厂 searchSourceBuilder.query(queryBuilder); //聚合工厂,相当于sql中的group by,如果es数据中是对象包含对象,就如下写法,以下就是以data对象中的name作为分组 AggregationBuilder termsBuilder = AggregationBuilders.terms("by_data.name").field("data.name"); //将聚合条件放入工厂 searchSourceBuilder.aggregation(termsBuilder); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = null; try { //执行请求 searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } //返回查询聚合后的结果,处理 Aggregations terms= searchResponse.getAggregations(); for (Aggregation a:terms){ ParsedTerms parsedTerms = (ParsedTerms) a; for (Terms.Bucket bucket : parsedTerms.getBuckets()) { log.info(bucket.getKeyAsString() + " " + bucket.getDocCount()); } } //返回查询到的具体数据 SearchHits searchHits = searchResponse.getHits(); for (SearchHit hit : searchHits.getHits()) { log.info(hit.getSourceAsString()); } }
2.1 范围查询
/** * 查询时间范围内所有接口调用次数 * @param index * @param type * @param startTime * @param endTime * @return * @throws IOException */ public SearchHits getCountByTimeRange(String index, String type, Long startTime, Long endTime) throws IOException { SearchRequest request = new SearchRequest(index); request.types(type); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); queryBuilder.must(QueryBuilders.rangeQuery("data.requestTime").gt(startTime).lt(endTime)); searchSourceBuilder.query(queryBuilder); request.source(searchSourceBuilder); SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT); SearchHits searchHits = searchResponse.getHits(); return searchHits; }
2.2 聚合设置过滤条件
/** * 聚合中设置过滤条件 * @param index * @param type * @param startTime * @param endTime * @return */ public Aggregations getOnDayInvokeAndError(String index, String type, Long startTime, Long endTime, Integer from, Integer size) throws Exception{ SearchRequest request = new SearchRequest(index); request.types(type); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); queryBuilder.must(QueryBuilders.rangeQuery("data.requestTime").gt(startTime).lt(endTime)) .must(QueryBuilders.termQuery("resource.logsource", "qqzx")); searchSourceBuilder.query(queryBuilder); //以interfaceCode分组,取interfaceName作为别名 AggregationBuilder termsBuilder = AggregationBuilders.terms("by_data.interfaceCode").field("data.interfaceCode").field("resource.interfaceName"); //设置过滤条件 AggregationBuilder filter = AggregationBuilders.filter("当日异常数量", QueryBuilders.boolQuery().must(QueryBuilders.termQuery("resource.status", "1"))); termsBuilder.subAggregation(filter); searchSourceBuilder.aggregation(termsBuilder).from(from).size(size); request.source(searchSourceBuilder); SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT); return searchResponse.getAggregations(); }
2.3 设置需要查询的字段和排除的字段
/** * * @param index * @param type * @param startTime * @param endTime * @return * @throws Exception */ public Set<String> getActiveInterfaceNotRegister(String index, String type, Long startTime, Long endTime, Page page) throws Exception { SearchRequest request = new SearchRequest(index); request.types(type); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); queryBuilder.must(QueryBuilders.rangeQuery("data.requestTime").gt(startTime).lt(endTime)); AggregationBuilder termsBuilder = AggregationBuilders.terms("by_data.interfaceCode").field("data.interfaceCode"); searchSourceBuilder.aggregation(termsBuilder);
//fetchSource中设置需要查询字段和排除字段 searchSourceBuilder.query(queryBuilder).fetchSource("data.interfaceCode", null).from(page.getOffset()).size(page.getLimit()); request.source(searchSourceBuilder); SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT); SearchHit[] hits = searchResponse.getHits().getHits(); Set<String> result = new HashSet<>(); for (SearchHit hit : hits) { String sourceAsString = hit.getSourceAsString(); JSONObject jsonObject = JSONObject.parseObject(sourceAsString); JSONObject data = jsonObject.getJSONObject("data"); result.add(data.getString("interfaceCode")); } return result; }
3 文档操作
3.1 新增
public static void main(String[] args) throws Exception { RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); // 插入数据 IndexRequest request = new IndexRequest(); request.index("user").id("1001"); User user = new User(); user.setName("zhangsan"); user.setAge(30); user.setSex("男"); // 向ES插入数据,必须将数据转换位JSON格式 ObjectMapper mapper = new ObjectMapper(); String userJson = mapper.writeValueAsString(user); request.source(userJson, XContentType.JSON); IndexResponse response = esClient.index(request, RequestOptions.DEFAULT); System.out.println(response.getResult()); esClient.close(); }
3.2 批量新增
public static void main(String[] args) throws Exception { RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); // 批量插入数据 BulkRequest request = new BulkRequest(); // request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age",30,"sex","男")); // request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi", "age",30,"sex","女")); // request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu", "age",40,"sex","男")); // request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "wangwu1", "age",40,"sex","女")); // request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "wangwu2", "age",50,"sex","男")); // request.add(new IndexRequest().index("user").id("1006").source(XContentType.JSON, "name", "wangwu3", "age",50,"sex","男")); //request.add(new IndexRequest().index("user").id("1007").source(XContentType.JSON, "name", "wangwu44", "age",60,"sex","男")); //request.add(new IndexRequest().index("user").id("1008").source(XContentType.JSON, "name", "wangwu555", "age",60,"sex","男")); request.add(new IndexRequest().index("user").id("1009").source(XContentType.JSON, "name", "wangwu66666", "age",60,"sex","男")); BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT); System.out.println(response.getTook()); System.out.println(response.getItems()); esClient.close(); }
3.3 更新
public static void main(String[] args) throws Exception { RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); // 修改数据 UpdateRequest request = new UpdateRequest(); request.index("user").id("1001"); request.doc(XContentType.JSON, "sex", "女"); UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT); System.out.println(response.getResult()); esClient.close(); }
3.4 查询
public static void main(String[] args) throws Exception { RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); // 查询数据 GetRequest request = new GetRequest(); request.index("user").id("1001"); GetResponse response = esClient.get(request, RequestOptions.DEFAULT); System.out.println(response.getSourceAsString()); esClient.close(); }
3.5 删除
public static void main(String[] args) throws Exception { RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); DeleteRequest request = new DeleteRequest(); request.index("user").id("1001"); DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT); System.out.println(response.toString()); esClient.close(); }
3.6 批量删除
public static void main(String[] args) throws Exception { RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); // 批量删除数据 BulkRequest request = new BulkRequest(); request.add(new DeleteRequest().index("user").id("1001")); request.add(new DeleteRequest().index("user").id("1002")); request.add(new DeleteRequest().index("user").id("1003")); BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT); System.out.println(response.getTook()); System.out.println(response.getItems()); esClient.close(); }
4 高级查询
public static void main(String[] args) throws Exception { RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); // 1. 查询索引中全部的数据 SearchRequest request = new SearchRequest(); request.indices("user"); request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery())); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } 2. 条件查询 : termQuery SearchRequest request = new SearchRequest(); request.indices("user"); request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30))); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } 3. 分页查询 SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()); // (当前页码-1)*每页显示数据条数 builder.from(2); builder.size(2); request.source(builder); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } // 4. 查询排序 SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()); // builder.sort("age", SortOrder.DESC); request.source(builder); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } // 5. 过滤字段 SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()); // String[] excludes = {"age"}; String[] includes = {}; builder.fetchSource(includes, excludes); request.source(builder); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } // 6. 组合查询 SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30)); //boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男")); //boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "男")); boolQueryBuilder.should(QueryBuilders.matchQuery("age", 30)); boolQueryBuilder.should(QueryBuilders.matchQuery("age", 40)); builder.query(boolQueryBuilder); request.source(builder); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } // 7. 范围查询 SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age"); rangeQuery.gte(30); rangeQuery.lt(50); builder.query(rangeQuery); request.source(builder); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } 8. 模糊查询 SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.fuzzyQuery("name", "wangwu").fuzziness(Fuzziness.TWO)); request.source(builder); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } // 9. 高亮查询 SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "zhangsan"); HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.preTags("<font color='red'>"); highlightBuilder.postTags("</font>"); highlightBuilder.field("name"); builder.highlighter(highlightBuilder); builder.query(termsQueryBuilder); request.source(builder); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } // 10. 聚合查询 SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age"); builder.aggregation(aggregationBuilder); request.source(builder); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } // 11. 分组查询 SearchRequest request = new SearchRequest(); request.indices("user"); SearchSourceBuilder builder = new SearchSourceBuilder(); AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age"); builder.aggregation(aggregationBuilder); request.source(builder); SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println(hits.getTotalHits()); System.out.println(response.getTook()); for ( SearchHit hit : hits ) { System.out.println(hit.getSourceAsString()); } esClient.close(); }
5.1 时间格式转换
5.2 使用Java代码脚本格式转换
5.2.1 背景
存入ES的字段是10位的时间戳格式,使用5.1正常方法转换失败,得使用Java代码来执行10位时间戳转为“yyyy-mm-dd”,然后根据“yyyy-mm-dd”格式做聚合查询访问次数。
5.3 使用脚本对中文,英文字段排序