Springboot整合ElasticSearch

ElasticSearch

Springboot整合ElasticSearch

1.导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2.配置es

@Configuration
public class ElasticSearchConfig {
    @Bean
    RestHighLevelClient restHighLevelClient()
    {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost",9200,"http")));
        return client;
    }

}

已经把restHighLevelClient给Spring管理了,接下来就可以测试使用ES的API咯

3.测试API

首先创建测试类,并导入RestHighLevelClient

  @Autowired
  @Qualifier("restHighLevelClient")
  private RestHighLevelClient client;

1.创建Index

/** 创建索引 */
@Test
void createIndexTest() throws IOException {
    // 1.创建索引请求
    CreateIndexRequest request = new CreateIndexRequest("JD_goods");
    // 2.执行请求
    CreateIndexResponse indexResponse = client.indices().create(request, RequestOptions.DEFAULT);
    System.out.println(indexResponse.isAcknowledged());
}

2.删除index

  /** 删除索引 */
  @Test
  void deleteIndexTest() throws IOException {
    // 1.创建索引请求
    DeleteIndexRequest indexRequest = new DeleteIndexRequest("sean_index1");
    // 2.执行请求
    AcknowledgedResponse delete = client.indices().delete(indexRequest, RequestOptions.DEFAULT);
    System.out.println(delete.isAcknowledged());
  }

3.测试index是否存在

  /** 测试获取索引 */
  @Test
  void getIndexTest() throws IOException {
    // 1.创建获取索引请求
    GetIndexRequest request = new GetIndexRequest("sean_index");
    // 2.判断索引是否存在
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    Assertions.assertTrue(exists);
  }

4.创建文档document

  /** 测试创建Document */
  @Test
  void createDocumentTest() throws IOException {
    // 1.创建User对象
    User user = new User(1, "张三", 10);
    // 2.创建索引对象
    IndexRequest request = new IndexRequest("sean_index");
    // 3.把User对象转换成Json字符串存到indexRequest对象中
    request.id(String.valueOf(user.getId()));
    IndexRequest indexRequest = request.source(JSON.toJSONString(user), XContentType.JSON);
    // 4.客户端发送请求
    IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);

    System.out.println(indexResponse.toString());
    System.out.println(indexResponse.status());
  }

5.文档是否存在

  /** 获取文档,判断是否存在 */
  @Test
  void existDocumentTest() throws IOException {
    // 1.创建获取请求对象 get /sean_index/_doc/1
    GetRequest getRequest = new GetRequest("sean_index", "1");
    // 2.不获取返回的_source的上下文(不会输出具体的内容)
    getRequest.fetchSourceContext(new FetchSourceContext(false));
    //    getRequest.storedFields("_none_");

    System.out.println(client.get(getRequest, RequestOptions.DEFAULT).toString());

    boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
    Assertions.assertTrue(exists);
  }

6.获取文档内容

 /** 获取文档内容 */
  @Test
  void getDocumentTest() throws IOException {
    GetRequest getRequest = new GetRequest("sean_index", "1");

    GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
    System.out.println(getResponse.getSourceAsString());
  }

7.更新文档

 /** 更新文档信息 */
  @Test
  void updateDocumentTest() throws IOException {
    UpdateRequest updateRequest = new UpdateRequest("sean_index", "1");
    updateRequest.timeout("1s");
    // 这样会更新全部字段,没有设置的字段设置成0
    User user = new User();
    user.setUsername("Lisa");

    updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
    UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
    System.out.println(updateResponse.getResult());
  }

8.删除文档

  /** 删除document记录 */
  @Test
  void deleteDocumentTest() throws IOException {
    DeleteRequest deleteRequest = new DeleteRequest("sean_index", "1");

    client.delete(deleteRequest, RequestOptions.DEFAULT);
  }

9.批量插入数据

 /** 批处理插入大量数据 应用:在实际项目中首次导入数据,数据从数据库查询出来后可以使用此方法批量导入es中 */
  @Test
  void BulkCreateTest() throws IOException {
    BulkRequest bulkRequest = new BulkRequest("sean_index");
    bulkRequest.timeout("10s");

    List<User> userList = new ArrayList<>();

    userList.add(new User(1, "Lisa1", 12));
    userList.add(new User(2, "Lisa2", 13));
    userList.add(new User(3, "Lisa3", 14));
    userList.add(new User(4, "Lisa4", 15));
    userList.add(new User(5, "Lisa5", 16));
    // 批处理请求
    for (int i = 0; i < userList.size(); i++) {
      bulkRequest.add(
          new IndexRequest("sean_index")
              .id(String.valueOf(i + 1))
              .source(JSON.toJSONString(userList.get(i)), XContentType.JSON));
    }
    BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);

    System.out.println(bulkResponse.hasFailures());
  }

10.搜索数据(关键字高亮)

 /** 搜索 search
   * searchRequest 搜索请求
   * SearchSourceBuilder 搜索条件构造
   * HighlightBuilder 高亮构造
   * xxx QueryBuilder 对应命令
   */
  @Test
  void searchDocumentTest() throws IOException {
    // 1.创建搜索请求
    SearchRequest searchRequest = new SearchRequest("sean_index");

    // 2.构建精确查找对象,可以使用QueryBuilders工具类来实现
    MatchPhraseQueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery("username", "Lisa1");
    /**
     * TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("username","Lisa1");
     * 使用该方法可能会查询不到结果,可以使用 QueryBuilders.matchPhraseQuery()替换
     */

    // 3.创建SearchSourceBuilder
    SearchSourceBuilder searchSourceBuilder =
        new SearchSourceBuilder().query(queryBuilder).timeout(new TimeValue(60, TimeUnit.SECONDS));

    //高亮
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.field("username");
    highlightBuilder.preTags("<span style='color:red'>");
    highlightBuilder.postTags("</span>");
    searchSourceBuilder.highlighter(highlightBuilder);


    // 4.发送请求
    SearchResponse searchResponse =
        client.search(searchRequest.source(searchSourceBuilder), RequestOptions.DEFAULT);

    searchResponse
        .getHits()
        .forEach(
            (searchHit) -> {
              System.out.println(searchHit.getSourceAsString());
            });
  }

image-20210825182737007

参考博客: https://blog.csdn.net/qq_39679997/article/details/106481685

遇到的問題:

參考博客: https://blog.csdn.net/YKenan/article/details/107380538

原文地址:https://www.cnblogs.com/seanRay/p/15190228.html