zoukankan      html  css  js  c++  java
  • springboot 集成Elasticsearch使用ElasticSearchTemplate进行增删改查操作

    概念

      • 类比mysql
        增删改查都是用的json
    elasticmysql
    index database
    type table
    document row
    file column
    mapping schema
    everything index
    PUT index/type insert
    DELETE index/type delete
    PUT index/type update
    GET index/type select

    每个index有10个shard,对应5个primary shade,5个replicate shard

    ElasticSearchTemplate的使用
    ElasticSearchTemplate更多是对ESRepository的补充,里面提供了一些更底层的方法。

     这里主要是一些查询相关的,同样是构建各种SearchQuery条件。
    也可以完成add操作

    String documentId = "123456";
            SampleEntity sampleEntity = new SampleEntity();
            sampleEntity.setId(documentId);
            sampleEntity.setMessage("some message");
            IndexQuery indexQuery = new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity).build();
            elasticsearchTemplate.index(indexQuery);

    add主要是通过index方法来完成,需要构建一个IndexQuery对象

     构建这个对象,主要是设置一下id,就是你的对象的id,Object就是对象本身,indexName和type就是在你的对象javaBean上声明的

     其他的字段自行发掘含义,构建完IndexQuery后就可以通过Template的index方法插入了。
    template里还有各种deleteIndex,delete,update等方法,用到的时候就查查看吧。
    下面讲一个批量插入的方法,我们经常需要往ElasticSearch中插入大量的测试数据来完成测试搜索,一条一条插肯定是不行的,ES提供了批量插入数据的功能——bulk。
    前面讲过JPA的save方法也可以save(List)批量插值,但适用于小数据量,要完成超大数据的插入就要用ES自带的bulk了,可以迅速插入百万级的数据。

    public void bulkIndex(List<IndexQuery> queries) {
            BulkRequestBuilder bulkRequest = this.client.prepareBulk();
            Iterator var3 = queries.iterator();
     
            while(var3.hasNext()) {
                IndexQuery query = (IndexQuery)var3.next();
                bulkRequest.add(this.prepareIndex(query));
            }
     
            BulkResponse bulkResponse = (BulkResponse)bulkRequest.execute().actionGet();
            if (bulkResponse.hasFailures()) {
                Map<String, String> failedDocuments = new HashMap();
                BulkItemResponse[] var5 = bulkResponse.getItems();
                int var6 = var5.length;
     
                for(int var7 = 0; var7 < var6; ++var7) {
                    BulkItemResponse item = var5[var7];
                    if (item.isFailed()) {
                        failedDocuments.put(item.getId(), item.getFailureMessage());
                    }
                }
     
                throw new ElasticsearchException("Bulk indexing has failures. Use ElasticsearchException.getFailedDocuments() for detailed messages [" + failedDocuments + "]", failedDocuments);
            }
        }
     
        public void bulkUpdate(List<UpdateQuery> queries) {
            BulkRequestBuilder bulkRequest = this.client.prepareBulk();
            Iterator var3 = queries.iterator();
     
            while(var3.hasNext()) {
                UpdateQuery query = (UpdateQuery)var3.next();
                bulkRequest.add(this.prepareUpdate(query));
            }
     
            BulkResponse bulkResponse = (BulkResponse)bulkRequest.execute().actionGet();
            if (bulkResponse.hasFailures()) {
                Map<String, String> failedDocuments = new HashMap();
                BulkItemResponse[] var5 = bulkResponse.getItems();
                int var6 = var5.length;
     
                for(int var7 = 0; var7 < var6; ++var7) {
                    BulkItemResponse item = var5[var7];
                    if (item.isFailed()) {
                        failedDocuments.put(item.getId(), item.getFailureMessage());
                    }
                }
     
                throw new ElasticsearchException("Bulk indexing has failures. Use ElasticsearchException.getFailedDocuments() for detailed messages [" + failedDocuments + "]", failedDocuments);
            }
        }

    和index插入单条数据一样,这里需要的是List仅此而已,是不是很简单。

    /***
         * 批量插入数据
         */
        @GetMapping(value = "/batchInsert")
        public void batchInsert(){
    
            int counter = 0;
    
                //判断index 是否存在
                if (!template.indexExists(CAR_INDEX_NAME)) {
                    template.createIndex(CAR_INDEX_NAME);
                }
    
                Gson gson = new Gson();
                List<IndexQuery> queries = new ArrayList<IndexQuery>();
                List<Car> cars = this.assembleTestData();
                if(cars != null && cars.size()>0){
                    for (Car car : cars) {
                        IndexQuery indexQuery = new IndexQuery();
                        indexQuery.setId(car.getId().toString());
                        indexQuery.setSource(gson.toJson(car));
                        indexQuery.setIndexName(CAR_INDEX_NAME);
                        indexQuery.setType(CAR_INDEX_TYPE);
                        queries.add(indexQuery);
                        //分批提交索引
                        if (counter % 500 == 0) {
                            template.bulkIndex(queries);
                            queries.clear();
                            System.out.println("bulkIndex counter : " + counter);
                        }
                        counter++;
                    }
    
                }
                //不足批的索引最后不要忘记提交
                if (queries.size() > 0) {
                    template.bulkIndex(queries);
                }
                template.refresh(CAR_INDEX_NAME);
           }

    这里是创建了100万个对象,每到500就用bulkIndex插入一次,速度飞快,以秒的速度插入了百万数据。

    OK,这篇主要是讲一些ElasticSearchRepository和ElasticSearchTemplate的用法,构造QueryBuilder的方式
    ``
    转载:https://blog.csdn.net/tianyaleixiaowu/article/details/76149547

  • 相关阅读:
    【剑指Offer】49把字符串转换成整数
    【剑指Offer】48不用加减乘除做加法
    【剑指Offer】47求1+2+3+...+n
    判断两个线段是否相交
    EM算法--原理
    理解KMP算法
    阿里校招笔试的一道逻辑题
    线性拟合之最小二乘方法和最小距离方法
    Oracle Net Manager 服务命名配置以及用PL/SQL 登陆数据库
    正则表达式总结
  • 原文地址:https://www.cnblogs.com/yoyowin/p/13834562.html
Copyright © 2011-2022 走看看