Maven环境

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

创建客户端

  1. import org.apache.http.HttpHost;
  2. import org.elasticsearch.client.RestClient;
  3. import org.elasticsearch.client.RestHighLevelClient;
  4. import org.elasticsearch.client.transport.TransportClient; // Deprecated
  5. import java.io.IOException;
  6. public class ESTestClient {
  7. public static void main(String[] args) throws IOException {
  8. // 创建ES客户端
  9. RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
  10. // 关闭ES客户端
  11. esClient.close();
  12. }
  13. }

创建索引

  1. CreateIndexRequest request = new CreateIndexRequest("users");
  2. CreateIndexResponse createIndexResponse = esClient.indices().create(request1, RequestOptions.DEFAULT);
  3. boolean acknowledge = createIndexResponse.isAcknowledged();
  4. System.out.println("响应状态" + acknowledge);

查询索引

  1. // 查询索引
  2. GetIndexRequest request2 = new GetIndexRequest("users");
  3. GetIndexResponse response2 = esClient.indices().get(request2, RequestOptions.DEFAULT);
  4. // 查询别名
  5. System.out.println(response2.getAliases());
  6. // 查询结构
  7. System.out.println(response2.getMappings());
  8. // 查询配置
  9. System.out.println(response2.getSettings());

删除索引

  1. // 删除索引
  2. DeleteIndexRequest request = new DeleteIndexRequest("users");
  3. AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);
  4. // 响应状态
  5. System.out.println(response.isAcknowledged());

文档新增

  1. // 创建ES客户端
  2. RestHighLevelClient esClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
  3. // 插入数据
  4. IndexRequest indexRequest = new IndexRequest();
  5. indexRequest.index("users").id("003");
  6. User user = new User();
  7. user.setAge(80);
  8. user.setName("wangwu");
  9. user.setSex("男");
  10. // 向ES插入数据必须转换成Json格式
  11. ObjectMapper mapper = new ObjectMapper();
  12. String userJson = mapper.writeValueAsString(user);
  13. indexRequest.source(userJson, XContentType.JSON);
  14. IndexResponse response = esClient.index(indexRequest, RequestOptions.DEFAULT);
  15. System.out.println(response.getResult());
  16. esClient.close();

文档修改

  1. // 修改数据
  2. UpdateRequest updateRequest = new UpdateRequest();
  3. updateRequest.index("users").id("003");
  4. updateRequest.doc(XContentType.JSON, "sex", "女", "age", 18);
  5. UpdateResponse response = esClient.update(updateRequest, RequestOptions.DEFAULT);
  6. System.out.println(response.getResult());

文档查询

  1. // 查询数据
  2. GetRequest request = new GetRequest();
  3. request.index("users").id("001");
  4. GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
  5. System.out.println(response.getSourceAsString());

文档的删除

  1. // 文档的删除
  2. DeleteRequest request = new DeleteRequest();
  3. request.index("users").id("003");
  4. DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
  5. System.out.println(response.getResult());

文档批量新增

  1. // 批量新增
  2. BulkRequest request = new BulkRequest();
  3. request.add(new IndexRequest().index("users").id("003").source(XContentType.JSON, "name", "张三"));
  4. request.add(new IndexRequest().index("users").id("004").source(XContentType.JSON, "name", "李四"));
  5. request.add(new IndexRequest().index("users").id("005").source(XContentType.JSON, "name", "王五"));
  6. BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
  7. System.out.println(response.getTook());
  8. System.out.println(response.getItems());

文档批量删除

  1. BulkRequest request = new BulkRequest();
  2. request.add(new DeleteRequest().index("users").id("003"));
  3. request.add(new DeleteRequest().index("users").id("004"));
  4. request.add(new DeleteRequest().index("users").id("005"));
  5. BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
  6. System.out.println(response.getTook());
  7. System.out.println(response.getItems());

文档全量查询

  1. // 查询索引中全部的数据
  2. SearchRequest request = new SearchRequest();
  3. request.indices("users");
  4. request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
  5. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  6. SearchHits hits = response.getHits();
  7. System.out.println(hits.getTotalHits());
  8. System.out.println(response.getTook());
  9. System.out.println("=================");
  10. for (SearchHit hit : hits) {
  11. System.out.println(hit.getSourceAsString());
  12. }

条件查询

  1. // 条件查询
  2. SearchRequest request = new SearchRequest();
  3. request.indices("users");
  4. request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("name", "张")));
  5. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  6. SearchHits hits = response.getHits();
  7. System.out.println(hits.getTotalHits());
  8. System.out.println(response.getTook());
  9. System.out.println("=================");
  10. for (SearchHit hit : hits) {
  11. System.out.println(hit.getSourceAsString());
  12. }

测试发现,termQuery("name", "张三")会搜索不到。只能查到倒排索引中有的,而name被识别为

分页查询

  1. // 分页查询
  2. SearchRequest request = new SearchRequest();
  3. request.indices("users");
  4. request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("name", "张")).from(2).size(2));
  5. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  6. SearchHits hits = response.getHits();
  7. System.out.println(hits.getTotalHits());
  8. System.out.println(response.getTook());
  9. System.out.println("=================");
  10. for (SearchHit hit : hits) {
  11. System.out.println(hit.getSourceAsString());
  12. }
  13. esClient.close();

查询排序

  1. // 查询排序
  2. SearchRequest request = new SearchRequest();
  3. request.indices("users");
  4. request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("name", "张")).sort("age", SortOrder.DESC));
  5. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  6. SearchHits hits = response.getHits();
  7. System.out.println(hits.getTotalHits());
  8. System.out.println(response.getTook());
  9. System.out.println("=================");
  10. for (SearchHit hit : hits) {
  11. System.out.println(hit.getSourceAsString());
  12. }

过滤字段

  1. // 过滤字段查询
  2. SearchRequest request = new SearchRequest();
  3. request.indices("users");
  4. SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
  5. String[] excludes = {"age"};
  6. String[] includes = {};
  7. builder.fetchSource(includes, excludes);
  8. request.source(builder);
  9. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  10. SearchHits hits = response.getHits();
  11. System.out.println(hits.getTotalHits());
  12. System.out.println(response.getTook());
  13. System.out.println("=================");
  14. for (SearchHit hit : hits) {
  15. System.out.println(hit.getSourceAsString());
  16. }

组合查询

  1. // 组合查询
  2. SearchRequest request = new SearchRequest();
  3. request.indices("users");
  4. SearchSourceBuilder builder = new SearchSourceBuilder();
  5. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  6. boolQueryBuilder.must(QueryBuilders.matchQuery("age", 18));
  7. boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "男"));
  8. // boolQueryBuilder.should(QueryBuilders.matchQuery("age", 18));
  9. builder.query(boolQueryBuilder);
  10. request.source(builder);
  11. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  12. SearchHits hits = response.getHits();
  13. for (SearchHit hit : hits) {
  14. System.out.println(hit.getSourceAsString());
  15. }

范围查询

  1. // 范围查询
  2. SearchRequest request = new SearchRequest();
  3. request.indices("users");
  4. SearchSourceBuilder builder = new SearchSourceBuilder();
  5. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
  6. rangeQueryBuilder.lte(30).gte(18);
  7. builder.query(rangeQueryBuilder);
  8. request.source(builder);
  9. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  10. SearchHits hits = response.getHits();
  11. for (SearchHit hit : hits) {
  12. System.out.println(hit.getSourceAsString());
  13. }

模糊查询

  1. // 模糊查询
  2. SearchRequest request = new SearchRequest();
  3. request.indices("users");
  4. SearchSourceBuilder builder = new SearchSourceBuilder();
  5. builder.query(QueryBuilders.fuzzyQuery("name", "张六").fuzziness(Fuzziness.ONE)); // 只偏差一个字符
  6. request.source(builder);
  7. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  8. SearchHits hits = response.getHits();
  9. for (SearchHit hit : hits) {
  10. System.out.println(hit.getSourceAsString());
  11. }

高亮查询

  1. // 高亮查询
  2. SearchRequest request = new SearchRequest();
  3. request.indices("users");
  4. SearchSourceBuilder builder = new SearchSourceBuilder();
  5. TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "三");
  6. HighlightBuilder highlightBuilder = new HighlightBuilder().preTags("<font color = 'red'>").postTags("</font>").field("name");
  7. builder.highlighter(highlightBuilder);
  8. builder.query(termsQueryBuilder);
  9. request.source(builder);
  10. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  11. SearchHits hits = response.getHits();
  12. for (SearchHit hit : hits) {
  13. System.out.println(hit.getSourceAsString());
  14. }

聚合查询

  1. // 聚合查询
  2. SearchRequest request = new SearchRequest();
  3. request.indices("users");
  4. SearchSourceBuilder builder = new SearchSourceBuilder();
  5. AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
  6. builder.aggregation(aggregationBuilder);
  7. request.source(builder);
  8. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  9. SearchHits hits = response.getHits();
  10. for (SearchHit hit : hits) {
  11. System.out.println(hit.getSourceAsString());
  12. }
  1. SearchRequest request = new SearchRequest();
  2. request.indices("users");
  3. SearchSourceBuilder builder = new SearchSourceBuilder();
  4. AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
  5. builder.aggregation(aggregationBuilder);
  6. request.source(builder);
  7. SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
  8. SearchHits hits = response.getHits();
  9. for (SearchHit hit : hits) {
  10. System.out.println(hit.getSourceAsString());
  11. }