1. 依赖

  1. <dependencies>
  2. <!-- elasticsearch -->
  3. <dependency>
  4. <groupId>org.elasticsearch</groupId>
  5. <artifactId>elasticsearch</artifactId>
  6. <version>7.8.0</version>
  7. </dependency>
  8. <!-- elasticsearch 的客户端 -->
  9. <dependency>
  10. <groupId>org.elasticsearch.client</groupId>
  11. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  12. <version>7.8.0</version>
  13. </dependency>
  14. <!-- elasticsearch 依赖 2.x 的 log4j -->
  15. <dependency>
  16. <groupId>org.apache.logging.log4j</groupId>
  17. <artifactId>log4j-api</artifactId>
  18. <version>2.8.2</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.apache.logging.log4j</groupId>
  22. <artifactId>log4j-core</artifactId>
  23. <version>2.8.2</version>
  24. </dependency>
  25. <!-- jackson -->
  26. <dependency>
  27. <groupId>com.fasterxml.jackson.core</groupId>
  28. <artifactId>jackson-databind</artifactId>
  29. <version>2.9.9</version>
  30. </dependency>
  31. </dependencies>

2. 客户端

早期版本的客户端对象已经不再推荐使用,且在未来版本中会被删除,所以这里采用高级 REST 客户端对象

  1. /**
  2. * ES 客户端的创建
  3. * @author JShawn 2021/8/5 11:24
  4. */
  5. public class EsClient_Test {
  6. /**
  7. * ES集群地址
  8. */
  9. private static final String ES_CLUSTER_HOST_PORT = "hadoop101:9200,hadoop102:9200,hadoop103:9200";
  10. /**
  11. * ES连接方式
  12. */
  13. private static final String ES_SCHEMA = "http";
  14. public static void main(String[] args) throws IOException {
  15. // 1. 获取ES客户端
  16. // 1. ES地址配置
  17. String[] clusters = ES_CLUSTER_HOST_PORT.split(",");
  18. HttpHost[] hosts = new HttpHost[clusters.length];
  19. for (int i = 0; i < clusters.length; i++) {
  20. String[] address = clusters[i].split(":");
  21. HttpHost httpHost = new HttpHost(address[0], Integer.parseInt(address[1]), ES_SCHEMA);
  22. hosts[i] = httpHost;
  23. }
  24. // 2. 创建客户端
  25. RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(hosts));
  26. // 3. 关闭客户端
  27. restHighLevelClient.close();
  28. }
  29. }

3. 索引

3.1 创建—-CreateIndexRequest

  1. /**
  2. * 1. 创建索引
  3. * @param restHighLevelClient ES客户端
  4. * @throws IOException
  5. */
  6. private static void createIndex(RestHighLevelClient restHighLevelClient) throws IOException {
  7. CreateIndexRequest indexRequest = new CreateIndexRequest("car");
  8. CreateIndexResponse response = restHighLevelClient.indices().create(indexRequest, RequestOptions.DEFAULT);
  9. LOGGER.info(response.isAcknowledged());
  10. }

3.2 查询

3.2.1 查询单个索引—-GetIndexRequest

  1. /**
  2. * 2. 查看单个索引
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getIndex(RestHighLevelClient restHighLevelClient) throws IOException {
  7. GetIndexRequest getIndexRequest = new GetIndexRequest("car");
  8. GetIndexResponse response = restHighLevelClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);
  9. LOGGER.info("别名:" + response.getAliases());
  10. LOGGER.info("indices:" + response.getIndices());
  11. LOGGER.info("映射结构:" + response.getMappings());
  12. LOGGER.info("settings:" + response.getSettings());
  13. }

3.2.2 查询全部索引—-GetAliasesRequest

  1. /**
  2. * 3. 查看全部索引
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getAllIndex(RestHighLevelClient restHighLevelClient) throws IOException {
  7. GetAliasesRequest aliasesRequest = new GetAliasesRequest();
  8. GetAliasesResponse response = restHighLevelClient.indices().getAlias(aliasesRequest,RequestOptions.DEFAULT);
  9. Map<String, Set<AliasMetadata>> aliases = response.getAliases();
  10. Set<String> indices = aliases.keySet();
  11. for (String key : indices) {
  12. LOGGER.info("索引:" + key);
  13. }
  14. }

3.3 删除—-DeleteIndexRequest

  1. /**
  2. * 4. 删除索引
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void deleteIndex(RestHighLevelClient restHighLevelClient) throws IOException {
  7. DeleteIndexRequest deleteRequest = new DeleteIndexRequest("student1");
  8. AcknowledgedResponse response = restHighLevelClient.indices().delete(deleteRequest, RequestOptions.DEFAULT);
  9. LOGGER.info(response.isAcknowledged());
  10. }

4. 文档

4.1 新增

4.1.1 单文档新增—-IndexRequest

  1. /**
  2. * 1.新增文档
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void insertDoc(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建数据,再转换成json
  8. Car car = new Car("BMW", "blue", 300000);
  9. ObjectMapper objectMapper = new ObjectMapper();
  10. String carJson = objectMapper.writeValueAsString(car);
  11. // 2. 封装数据
  12. IndexRequest request = new IndexRequest("car");
  13. // 2.1 设置唯一性标识,不设置ES自动生成
  14. request.id("1001");
  15. // 2.2 将数据封装到请求体中
  16. request.source(carJson,XContentType.JSON);
  17. // 3. 发送请求,获取响应
  18. IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
  19. LOGGER.info("index:" + response.getIndex());
  20. LOGGER.info("id:" + response.getId());
  21. LOGGER.info("result:" + response.getResult());
  22. }

4.1.2 批量新增—-BulkRequest

  1. /**
  2. * 2. 批量新增文档
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void batchInsertDoc(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建BulkRequest对象
  8. BulkRequest bulkRequest = new BulkRequest();
  9. // 2. 封装数据
  10. bulkRequest.add(new IndexRequest("car").id("1001").source(XContentType.JSON, "name", "bmw", "color", "blue", "price", 300000));
  11. bulkRequest.add(new IndexRequest("car").id("1002").source(XContentType.JSON, "name", "audi", "color", "write", "price", 400000));
  12. bulkRequest.add(new IndexRequest("car").id("1003").source(XContentType.JSON, "name", "bens", "color", "black", "price", 500000));
  13. bulkRequest.add(new IndexRequest("car").id("1004").source(XContentType.JSON, "name", "bmw", "color", "yellow", "price", 600000));
  14. bulkRequest.add(new IndexRequest("car").id("1005").source(XContentType.JSON, "name", "audi", "color", "blue", "price", 700000));
  15. bulkRequest.add(new IndexRequest("car").id("1006").source(XContentType.JSON, "name", "bens", "color", "blue", "price", 800000));
  16. // 3. 发送请求,获取响应
  17. BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
  18. LOGGER.info("用时:" + response.getTook());
  19. LOGGER.info("items:" + response.getItems());
  20. }

4.2 修改—-UpdateRequest

  1. /**
  2. * 3. 修改文档
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void updateDoc(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建UpdateRequest对象
  8. UpdateRequest request = new UpdateRequest();
  9. // 2.封装数据
  10. request.index("car");
  11. request.id("1004");
  12. request.doc(XContentType.JSON, "color", "yellow");
  13. // 3. 发送请求,获取响应
  14. UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
  15. LOGGER.info("_index:" + response.getIndex());
  16. LOGGER.info("_id:" + response.getId());
  17. LOGGER.info("_result:" + response.getResult());
  18. }

4.3 删除

4.3.1 主键删除—-DeleteRequest

  1. /**
  2. * 5. 主键删除文档
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void deleteDoc(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建DeleteRequest对象
  8. DeleteRequest deleteRequest = new DeleteRequest("car");
  9. // 2.封装数据
  10. deleteRequest.id("1004");
  11. // 3. 发送请求,获取响应
  12. DeleteResponse response = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
  13. LOGGER.info(response.toString());
  14. }

4.3.2 批量删除—-BulkRequest

  1. /**
  2. * 6. 批量删除文档
  3. * @param restHighLevelClient ES客户端
  4. */
  5. private static void batchDeleteDoc(RestHighLevelClient restHighLevelClient) throws IOException {
  6. // 1. 创建BulkRequest对象
  7. BulkRequest request = new BulkRequest();
  8. // 2. 封装数据
  9. request.add(new DeleteRequest("car").id("1001"));
  10. request.add(new DeleteRequest("car").id("1002"));
  11. request.add(new DeleteRequest("car").id("1003"));
  12. request.add(new DeleteRequest("car").id("1004"));
  13. request.add(new DeleteRequest("car").id("1005"));
  14. request.add(new DeleteRequest("car").id("1006"));
  15. // 3. 发送请求,获取响应
  16. BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
  17. LOGGER.info("took:" + response.getTook());
  18. LOGGER.info("items:" + response.getItems());
  19. }

4.4 查询

4.3.1 主键查询—-GetRequest

  1. /**
  2. * 4. 查询文档
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getDoc(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建GetRequest对象
  8. GetRequest request = new GetRequest("car");
  9. // 2.封装数据
  10. request.id("1001");
  11. // 3. 发送请求,获取响应
  12. GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
  13. LOGGER.info("_index:" + response.getIndex());
  14. LOGGER.info("_type:" + response.getType());
  15. LOGGER.info("source" + response.getSourceAsString());
  16. }

4.3.2 高级查询—-SearchRequest

4.3.2.1 全量查询—-matchAllQuery()

  1. /**
  2. * 2. 全量查询 --- matchAllQuery()
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getAllDoc(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建搜索请求对象
  8. SearchRequest request = new SearchRequest();
  9. request.indices("car");
  10. // 2. 构建查询请求体
  11. SearchSourceBuilder builder = new SearchSourceBuilder();
  12. builder.query(QueryBuilders.matchAllQuery());
  13. request.source(builder);
  14. // 3. 发送请求,接收响应
  15. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  16. SearchHits hits = response.getHits();
  17. LOGGER.info("耗时:" + response.getTook());
  18. LOGGER.info("是否超时:" + response.isTimedOut());
  19. LOGGER.info("总数:" + hits.getTotalHits());
  20. LOGGER.info("maxScore:" + hits.getMaxScore());
  21. LOGGER.info("hits =======================>>");
  22. for (SearchHit hit : hits) {
  23. // 4. 输出数据
  24. LOGGER.info(hit.getSourceAsString());
  25. }
  26. LOGGER.info("<<========================");
  27. }

4.3.2.2 条件查询—-termQuery(“字段”, “值”)

注意:term条件不分词,keyword不分词,text分词

  1. /**
  2. * 3. 条件查询---termQuery("字段", "值")
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getDocByTermQuery(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建搜索请求对象
  8. SearchRequest request = new SearchRequest("car");
  9. // 2. ******构建查询请求体******
  10. SearchSourceBuilder builder = new SearchSourceBuilder();
  11. builder.query(QueryBuilders.termQuery("name", "bmw"));
  12. request.source(builder);
  13. // 3. 发送请求,接收响应
  14. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  15. SearchHits hits = response.getHits();
  16. LOGGER.info("耗时:" + response.getTook());
  17. LOGGER.info("是否超时:" + response.isTimedOut());
  18. LOGGER.info("总数:" + hits.getTotalHits());
  19. LOGGER.info("maxScore:" + hits.getMaxScore());
  20. LOGGER.info("hits =======================>>");
  21. for (SearchHit hit : hits) {
  22. // 4. 输出数据
  23. LOGGER.info(hit.getSourceAsString());
  24. }
  25. LOGGER.info("<<========================");
  26. }

4.3.2.3 通配符查询—-wildcardQuery(“字段”, ““)

注意:wildcard条件不分词,keyword不分词,text分词

  1. /**
  2. * 4. 通配符查询 --- wildcardQuery("字段", "*值*")
  3. *
  4. * @param restHighLevelClient ES客户端
  5. * @throws IOException
  6. */
  7. private static void getDocByWildcard(RestHighLevelClient restHighLevelClient) throws IOException {
  8. // 1. 创建搜索请求对象
  9. SearchRequest request = new SearchRequest("car");
  10. // 2.******构建查询请求体******
  11. SearchSourceBuilder builder = new SearchSourceBuilder();
  12. WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("name", "*m*");
  13. builder.query(wildcardQueryBuilder);
  14. request.source(builder);
  15. // 3. 发送请求,接收响应
  16. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  17. SearchHits hits = response.getHits();
  18. LOGGER.info("耗时:" + response.getTook());
  19. LOGGER.info("是否超时:" + response.isTimedOut());
  20. LOGGER.info("总数:" + hits.getTotalHits());
  21. LOGGER.info("maxScore:" + hits.getMaxScore());
  22. LOGGER.info("hits =======================>>");
  23. for (SearchHit hit : hits) {
  24. // 4. 输出数据
  25. LOGGER.info(hit.getSourceAsString());
  26. }
  27. LOGGER.info("<<========================");
  28. }

4.3.2.4 分页查询—-builder.from(起始值)+builder.size(页量)

  1. /**
  2. * 5. 分页查询
  3. *
  4. * builder.from(起始值); from = (pageNo-1) * size
  5. * builder.size(页量);
  6. *
  7. * @param restHighLevelClient ES客户端
  8. */
  9. private static void getDocByPage(RestHighLevelClient restHighLevelClient) throws IOException {
  10. // 1. 创建搜索请求对象
  11. SearchRequest request = new SearchRequest("car");
  12. // 2.******构建查询请求体******
  13. SearchSourceBuilder builder = new SearchSourceBuilder();
  14. builder.query(QueryBuilders.matchAllQuery());
  15. builder.from(3); // from = (pageNo-1) * pageSize
  16. builder.size(2);
  17. request.source(builder);
  18. // 3. 发送请求,接收响应
  19. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  20. SearchHits hits = response.getHits();
  21. LOGGER.info("耗时:" + response.getTook());
  22. LOGGER.info("是否超时:" + response.isTimedOut());
  23. LOGGER.info("总数:" + hits.getTotalHits());
  24. LOGGER.info("maxScore:" + hits.getMaxScore());
  25. LOGGER.info("hits =======================>>");
  26. for (SearchHit hit : hits) {
  27. // 4. 输出数据
  28. LOGGER.info(hit.getSourceAsString());
  29. }
  30. LOGGER.info("<<========================");
  31. }

4.3.2.5 排序查询—-builder.sort(“字段”, SortOrder.DESC/ASC)

text字段不支持聚合和排序

  1. /**
  2. * 6. 排序查询
  3. *
  4. * builder.sort("字段", SortOrder.DESC/ASC);
  5. *
  6. * @param restHighLevelClient ES客户端
  7. */
  8. private static void getDocBySort(RestHighLevelClient restHighLevelClient) throws IOException {
  9. // 1. 创建搜索请求对象
  10. SearchRequest request = new SearchRequest("car");
  11. // 2.******构建查询请求体******
  12. SearchSourceBuilder builder = new SearchSourceBuilder();
  13. builder.query(QueryBuilders.matchAllQuery());
  14. builder.sort("price", SortOrder.DESC);
  15. request.source(builder);
  16. // 3. 发送请求,接收响应
  17. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  18. SearchHits hits = response.getHits();
  19. LOGGER.info("耗时:" + response.getTook());
  20. LOGGER.info("是否超时:" + response.isTimedOut());
  21. LOGGER.info("总数:" + hits.getTotalHits());
  22. LOGGER.info("maxScore:" + hits.getMaxScore());
  23. LOGGER.info("hits =======================>>");
  24. for (SearchHit hit : hits) {
  25. // 4. 输出数据
  26. LOGGER.info(hit.getSourceAsString());
  27. }
  28. LOGGER.info("<<========================");
  29. }

4.3.2.6 过滤字段查询—-builder.fetchSource(includes,excludes)

  1. /**
  2. * 7. 过滤字段查询 --- builder.fetchSource(includes,excludes);
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getDocByIncludeAndExclude(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建搜索请求对象
  8. SearchRequest request = new SearchRequest("car");
  9. // 2.******构建查询请求体******
  10. SearchSourceBuilder builder = new SearchSourceBuilder();
  11. String[] includes = {"name"};
  12. //String[] excludes = {"price"};
  13. builder.fetchSource(includes,new String[]{});
  14. request.source(builder);
  15. // 3. 发送请求,接收响应
  16. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  17. SearchHits hits = response.getHits();
  18. LOGGER.info("耗时:" + response.getTook());
  19. LOGGER.info("是否超时:" + response.isTimedOut());
  20. LOGGER.info("总数:" + hits.getTotalHits());
  21. LOGGER.info("maxScore:" + hits.getMaxScore());
  22. LOGGER.info("hits =======================>>");
  23. for (SearchHit hit : hits) {
  24. // 4. 输出数据
  25. LOGGER.info(hit.getSourceAsString());
  26. }
  27. LOGGER.info("<<========================");
  28. }

4.3.2.7 组合查询—-boolQuery()

  1. /**
  2. * 8. 组合查询 --- boolQuery()
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getDocByBool(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建搜索请求对象
  8. SearchRequest request = new SearchRequest("car");
  9. // 2.******构建查询请求体******
  10. SearchSourceBuilder builder = new SearchSourceBuilder();
  11. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  12. boolQueryBuilder.must(QueryBuilders.matchQuery("name", "bmw"));
  13. boolQueryBuilder.must(QueryBuilders.matchQuery("price", 300000));
  14. //boolQueryBuilder.mustNot(QueryBuilders.matchQuery("price", 300000));
  15. //boolQueryBuilder.should(QueryBuilders.matchQuery("price", 300000));
  16. builder.query(boolQueryBuilder);
  17. request.source(builder);
  18. // 3. 发送请求,接收响应
  19. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  20. SearchHits hits = response.getHits();
  21. LOGGER.info("耗时:" + response.getTook());
  22. LOGGER.info("是否超时:" + response.isTimedOut());
  23. LOGGER.info("总数:" + hits.getTotalHits());
  24. LOGGER.info("maxScore:" + hits.getMaxScore());
  25. LOGGER.info("hits =======================>>");
  26. for (SearchHit hit : hits) {
  27. // 4. 输出数据
  28. LOGGER.info(hit.getSourceAsString());
  29. }
  30. LOGGER.info("<<========================");
  31. }

4.3.2.8 范围查询—-rangeQuery(“字段”)

  1. /**
  2. * 9. 范围查询 --- rangeQuery("字段")
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getDocByRange(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建搜索请求对象
  8. SearchRequest request = new SearchRequest("car");
  9. // 2.******构建查询请求体******
  10. SearchSourceBuilder builder = new SearchSourceBuilder();
  11. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("price");
  12. rangeQueryBuilder.gte(300000);
  13. rangeQueryBuilder.lte(500000);
  14. builder.query(rangeQueryBuilder);
  15. request.source(builder);
  16. // 3. 发送请求,接收响应
  17. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  18. SearchHits hits = response.getHits();
  19. LOGGER.info("耗时:" + response.getTook());
  20. LOGGER.info("是否超时:" + response.isTimedOut());
  21. LOGGER.info("总数:" + hits.getTotalHits());
  22. LOGGER.info("maxScore:" + hits.getMaxScore());
  23. LOGGER.info("hits =======================>>");
  24. for (SearchHit hit : hits) {
  25. // 4. 输出数据
  26. LOGGER.info(hit.getSourceAsString());
  27. }
  28. LOGGER.info("<<========================");
  29. }

4.3.2.9 纠错查询—-fuzzyQuery(“字段”, “值”).fuzziness(Fuzziness.ONE/TOW/AUTO)

  1. /**
  2. * 10. 纠错查询 --- fuzzyQuery("字段", "值").fuzziness(Fuzziness.ONE/TOW/AUTO); //fuzziness()设置容忍错几个字符
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getDocByFuzzy(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建搜索请求对象
  8. SearchRequest request = new SearchRequest("car");
  9. // 2.******构建查询请求体******
  10. SearchSourceBuilder builder = new SearchSourceBuilder();
  11. FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("name", "bba").fuzziness(Fuzziness.TWO); //fuzziness()设置容忍错几个字符
  12. builder.query(fuzzyQueryBuilder);
  13. request.source(builder);
  14. // 3. 发送请求,接收响应
  15. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  16. SearchHits hits = response.getHits();
  17. LOGGER.info("耗时:" + response.getTook());
  18. LOGGER.info("是否超时:" + response.isTimedOut());
  19. LOGGER.info("总数:" + hits.getTotalHits());
  20. LOGGER.info("maxScore:" + hits.getMaxScore());
  21. LOGGER.info("hits =======================>>");
  22. for (SearchHit hit : hits) {
  23. // 4. 输出数据
  24. LOGGER.info(hit.getSourceAsString());
  25. }
  26. LOGGER.info("<<========================");
  27. }

4.3.2.10 高亮查询—-HighlightBuilder

  1. /**
  2. * 11. 高亮查询(前提是有搜索关键词,即条件查询)
  3. *
  4. * HighlightBuilder.filed("字段")
  5. * HighlightBuilder.pretTags("前缀")
  6. * HighlightBuilder.posttTags("后缀")
  7. * @param restHighLevelClient ES客户端
  8. */
  9. private static void getDocByHighlight(RestHighLevelClient restHighLevelClient) throws IOException {
  10. // 1. 创建搜索请求对象
  11. SearchRequest request = new SearchRequest("car");
  12. // 2.******构建查询请求体******
  13. SearchSourceBuilder builder = new SearchSourceBuilder();
  14. // 2.1 首先条件查询
  15. QueryBuilder queryBuilder = QueryBuilders.termQuery("name","bmw");
  16. // 2.2 构建高亮字段及前后缀
  17. HighlightBuilder highlightBuilder = new HighlightBuilder();
  18. highlightBuilder.field("name");
  19. highlightBuilder.preTags("<font color='red'>");
  20. highlightBuilder.postTags("</font>");
  21. // 2.3 设置查询方式、高亮对象
  22. builder.query(queryBuilder);
  23. builder.highlighter(highlightBuilder);
  24. // 2.4 交给request
  25. request.source(builder);
  26. // 3. 发送请求,接收响应
  27. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  28. SearchHits hits = response.getHits();
  29. LOGGER.info("耗时:" + response.getTook());
  30. LOGGER.info("是否超时:" + response.isTimedOut());
  31. LOGGER.info("总数:" + hits.getTotalHits());
  32. LOGGER.info("maxScore:" + hits.getMaxScore());
  33. LOGGER.info("hits =======================>>");
  34. for (SearchHit hit : hits) {
  35. // 4. 输出数据
  36. LOGGER.info(hit.getSourceAsString());
  37. // 4.1 获取高亮字段
  38. LOGGER.info(hit.getHighlightFields());
  39. }
  40. LOGGER.info("<<========================");
  41. }

4.3.2.11 聚合统计查询—-AggregationBuilders.max(“聚合名称”)|min()|count()|avg()|…|.field(“聚合字段”)

text字段不支持聚合和排序

  1. /**
  2. * 12. 聚合统计查询------AggregationBuilders.max("聚合名称")|min()|count()|avg()|...|.field("price")
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getDocByAgg(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建搜索请求对象
  8. SearchRequest request = new SearchRequest("car");
  9. // 2.******构建查询请求体******
  10. SearchSourceBuilder builder = new SearchSourceBuilder();
  11. MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("maxPrice").field("price");
  12. builder.aggregation(maxAggregationBuilder);
  13. request.source(builder);
  14. // 3. 发送请求,接收响应
  15. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  16. SearchHits hits = response.getHits();
  17. // 4. ******解析聚合统计结果******
  18. Aggregations aggregations = response.getAggregations();
  19. ParsedMax parsedMax = aggregations.get("maxPrice");
  20. LOGGER.info("耗时:" + response.getTook());
  21. LOGGER.info("是否超时:" + response.isTimedOut());
  22. LOGGER.info("总数:" + hits.getTotalHits());
  23. LOGGER.info("maxScore:" + hits.getMaxScore());
  24. LOGGER.info("统计结果:" + parsedMax.getValueAsString());
  25. LOGGER.info("hits =======================>>");
  26. for (SearchHit hit : hits) {
  27. // 4. 输出数据
  28. LOGGER.info(hit.getSourceAsString());
  29. }
  30. LOGGER.info("<<========================");
  31. }

4.3.2.12 分组统计查询—-AggregationBuilders.terms(“分组名称”).field(“分组字段”)

text字段不支持聚合和排序

  1. /**
  2. * 13. 分组统计查询(注意:text字段不能做分组)--- AggregationBuilders.terms("分组名称").field("分组字段")
  3. *
  4. * @param restHighLevelClient ES客户端
  5. */
  6. private static void getDocByAgg2(RestHighLevelClient restHighLevelClient) throws IOException {
  7. // 1. 创建搜索请求对象
  8. SearchRequest request = new SearchRequest("car");
  9. // 2.******构建查询请求体******
  10. SearchSourceBuilder builder = new SearchSourceBuilder();
  11. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("name_groupby").field("name");
  12. builder.aggregation(termsAggregationBuilder);
  13. request.source(builder);
  14. // 3. 发送请求,接收响应
  15. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
  16. SearchHits hits = response.getHits();
  17. // 4. 解析分组统计结果
  18. //搜索结果状态信息
  19. List<Map> result=new ArrayList<>();
  20. Aggregations aggregations = response.getAggregations();
  21. Terms terms = aggregations.get("name_groupby");
  22. for(Terms.Bucket buck : terms.getBuckets()) {
  23. Map map=new HashMap();
  24. String[] arr= buck.getKeyAsString().split("#");
  25. map.put("module",arr[0].replace("[","").replace("]",""));
  26. map.put("user_id",arr[1].replace("[","").replace("]",""));
  27. //取子聚合
  28. ParsedValueCount averageBalance = buck.getAggregations().get("count");
  29. map.put("count",averageBalance.getValue());
  30. result.add(map);
  31. }
  32. LOGGER.info("耗时:" + response.getTook());
  33. LOGGER.info("是否超时:" + response.isTimedOut());
  34. LOGGER.info("总数:" + hits.getTotalHits());
  35. LOGGER.info("maxScore:" + hits.getMaxScore());
  36. LOGGER.info("分组统计结果:" + result.toString());
  37. LOGGER.info("hits =======================>>");
  38. for (SearchHit hit : hits) {
  39. // 4. 输出数据
  40. LOGGER.info(hit.getSourceAsString());
  41. }
  42. LOGGER.info("<<========================");
  43. }