zoukankan      html  css  js  c++  java
  • SpringBoot&Elasticsearch

    SpringBoot&Elasticsearch

    SpringBoot集成es有三种方法:java api、rest client、data-es,主流的是第三种方法

    1. java api:这种方式,官方已经明确表示在ES 7.0版本中将弃用TransportClient客户端,且在8.0版本中完全移除它。

    2. rest client:官方给出来的REST Client有Java Low Level REST Client和Java Hight Level REST Client两个,前者兼容所有版本的ES,后者是基于前者开发出来的,只暴露了部分API,待完善。

    3. spring-data-es: Spring提供了本身基于SpringData实现的一套方案spring-data-elasticsearch,还有后来衍生的spring-boot-data-elasticsearch,都是一样的,版本之间的搭配建议为:

      spring data elasticsearchelasticsearch
      3.1.x 6.2.2
      3.0.x 5.5.0
      2.1.x 2.4.0
      2.0.x 2.2.0
      1.3.x 1.5.2

    注意:

      学习方式(官方文档)

        查看官方文档地址:https://www.elastic.co/guide/index.html

        分别可以查询ES集成的三种方式。

     

    1、引入依赖包

    创建一个springboot的项目 同时勾选上springboot-web的包以及Nosql的elasticsearch的包

    如果没有就手动引入(注意自己ES的版本

             <!--es客户端-->
             <dependency>
                 <groupId>org.elasticsearch.client</groupId>
                 <artifactId>elasticsearch-rest-high-level-client</artifactId>
                 <version>7.9.2</version>
             </dependency><!--springboot的elasticsearch服务-->
             <dependency>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
             </dependency><!--json工具-->
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>fastjson</artifactId>
                 <version>1.2.78</version>
             </dependency>        

    注意下spring-boot的parent包内的依赖的es的版本是不是你对应的版本

    不是的话就在pom文件下写个properties的版本

     <!--这边配置下自己对应的版本-->
     <properties>
         <java.version>1.8</java.version>
         <elasticsearch.version>7.9.2</elasticsearch.version>
     </properties>

    2、配置类

    注入RestHighLevelClient 客户端

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

    3、索引API测试

        @Autowired
        private RestHighLevelClient restHighLevelClient;
    
        //测试索引的创建
        @Test
        void testCreateIndex() throws IOException {
            //1.创建索引的请求
            CreateIndexRequest request = new CreateIndexRequest("mmdz_index");
            //2客户端执行请求,请求后获得响应
            CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
            System.out.println(response);
        }
    
        //测试索引是否存在
        @Test
        void testExistIndex() throws IOException {
            //1.获取索引的请求
            GetIndexRequest request = new GetIndexRequest("mmdz_index111");
            //2客户端执行请求,请求后获得响应
            boolean exist =  restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
            System.out.println("测试索引是否存在-----"+exist);
        }
    
        //删除索引
        @Test
        void testDeleteIndex() throws IOException {
            DeleteIndexRequest request = new DeleteIndexRequest("mmdz_index");
            AcknowledgedResponse delete = restHighLevelClient.indices().delete(request,RequestOptions.DEFAULT);
            System.out.println("删除索引--------"+delete.isAcknowledged());
        }

    4、文档API操作

        //测试添加文档
        @Test
        void testAddDocument() throws IOException {
            Person person = new Person("mmdz",27);
            IndexRequest request = new IndexRequest("mmdz_index");
            request.id("1");
            //设置超时时间
            request.timeout("1s");
            //将数据放到json字符串
            request.source(JSON.toJSONString(person), XContentType.JSON);
            //发送请求
            IndexResponse response = restHighLevelClient.index(request,RequestOptions.DEFAULT);
            System.out.println("添加文档-------"+response.toString());
            System.out.println("添加文档-------"+response.status());
        }
    
        //测试文档是否存在
        @Test
        void testExistDocument() throws IOException {
            //测试文档的 没有index
            GetRequest request= new GetRequest("mmdz_index","1");
            //没有indices()了
            boolean exist = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
            System.out.println("测试文档是否存在-----"+exist);
        }
    
        //测试获取文档
        @Test
        void testGetDocument() throws IOException {
            GetRequest request= new GetRequest("mmdz_index","1");
            GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
            System.out.println("测试获取文档-----"+response.getSourceAsString());
            System.out.println("测试获取文档-----"+response);
        }
    
        //测试修改文档
        @Test
        void testUpdateDocument() throws IOException {
            Person person = new Person("李逍遥", 55);
            //修改是id为1的
            UpdateRequest request= new UpdateRequest("mmdz_index","1");
            request.timeout("1s");
            request.doc(JSON.toJSONString(person),XContentType.JSON);
    
            UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
            System.out.println("测试修改文档-----"+response);
            System.out.println("测试修改文档-----"+response.status());
        }
    
    
        //测试删除文档
        @Test
        void testDeleteDocument() throws IOException {
            DeleteRequest request= new DeleteRequest("mmdz_index","1");
            request.timeout("1s");
            DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
            System.out.println("测试删除文档------"+response.status());
        }
    
        //测试批量添加文档
        @Test
        void testBulkAddDocument() throws IOException {
            ArrayList<Person> persons =new ArrayList<Person>();
            persons.add(new Person("cyx1",5));
            persons.add(new Person("cyx2",6));
            persons.add(new Person("cyx3",40));
            persons.add(new Person("cyx4",25));
            persons.add(new Person("cyx5",15));
            persons.add(new Person("cyx6",35));
    
            //批量操作的Request
            BulkRequest request = new BulkRequest();
            request.timeout("1s");
    
            //批量处理请求
            for (int i = 0; i < persons.size(); i++) {
                request.add(
                        new IndexRequest("mmdz_index")
                                .id(""+(i+1))
                                .source(JSON.toJSONString(persons.get(i)),XContentType.JSON)
                );
            }
            BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
            //response.hasFailures()是否是失败的
            System.out.println("测试批量添加文档-----"+response.hasFailures());
    //        结果:false为成功 true为失败
    //        测试批量添加文档-----false
        }
    
    
        //测试查询文档
        @Test
        void testSearchDocument() throws IOException {
            SearchRequest request = new SearchRequest("mmdz_index");
            //构建搜索条件
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            //设置了高亮
            sourceBuilder.highlighter();
            //term name为cyx1的
            TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "cyx1");
            sourceBuilder.query(termQueryBuilder);
            sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    
            request.source(sourceBuilder);
            SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
    
            System.out.println("测试查询文档-----"+JSON.toJSONString(response.getHits()));
            System.out.println("=====================");
            for (SearchHit documentFields : response.getHits().getHits()) {
                System.out.println("测试查询文档--遍历参数--"+documentFields.getSourceAsMap());
            }
    
    //        测试查询文档-----{"fragment":true,"hits":[{"fields":{},"fragment":false,"highlightFields":{},"id":"1","matchedQueries":[],"primaryTerm":0,"rawSortValues":[],"score":1.8413742,"seqNo":-2,"sortValues":[],"sourceAsMap":{"name":"cyx1","age":5},"sourceAsString":"{"age":5,"name":"cyx1"}","sourceRef":{"fragment":true},"type":"_doc","version":-1}],"maxScore":1.8413742,"totalHits":{"relation":"EQUAL_TO","value":1}}
    //        =====================
    //        测试查询文档--遍历参数--{name=cyx1, age=5}
        }

    测试的 elasticsearch 导入包

    import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
    import org.elasticsearch.action.bulk.BulkRequest;
    import org.elasticsearch.action.bulk.BulkResponse;
    import org.elasticsearch.action.delete.DeleteRequest;
    import org.elasticsearch.action.delete.DeleteResponse;
    import org.elasticsearch.action.get.GetRequest;
    import org.elasticsearch.action.get.GetResponse;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.action.search.SearchRequest;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.action.support.master.AcknowledgedResponse;
    import org.elasticsearch.action.update.UpdateRequest;
    import org.elasticsearch.action.update.UpdateResponse;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.client.indices.CreateIndexRequest;
    import org.elasticsearch.client.indices.CreateIndexResponse;
    import org.elasticsearch.client.indices.GetIndexRequest;
    import org.elasticsearch.common.unit.TimeValue;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.index.query.TermQueryBuilder;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.search.builder.SearchSourceBuilder;
  • 相关阅读:
    Web前端面试(二):CSS盒模型
    Web前端面试题
    微信小程序之base64图片如何预览与一键保存到本地相册?
    微信小程序 —搜索框
    初次
    用document.getElementsByTagName()返回的真的是数组吗?
    《精通CSS:高级Web标准解决方案》学习笔记(下)
    Git常用命令
    博客施工暂时告一段落
    《精通CSS:高级Web标准解决方案》学习笔记(上)
  • 原文地址:https://www.cnblogs.com/mmdz/p/15471073.html
Copyright © 2011-2022 走看看