zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    cmd utf-8 just run:CHCP 65001
    PHP5已注册的hash函数
    php扩展开发笔记1
    configure: error: cannot find neither zip nor jar, cannot continue
    configure: error: cannot compute suffix of object files: cannot compile
    configure: error: I suspect your system does not have 32-bit developement libraries (libc and headers). If you have them, rerun configure with --enable-multilib. If you do not have them, and want to b
    /usr/bin/ld: crt1.o: No such file: No such file or directory
    近两周工作总结
    我觉得好用的VS扩展(不定期更新)
    vmware虚拟机无法ping通宿主机,但宿主机可以ping通虚拟机
  • 原文地址:https://www.cnblogs.com/seanRay/p/15190228.html
Copyright © 2011-2022 走看看