1. 程式人生 > 實用技巧 >springboot 整合Elasticsearch使用ElasticSearchTemplate進行增刪改查操作

springboot 整合Elasticsearch使用ElasticSearchTemplate進行增刪改查操作

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