概念
- 類比mysql
增刪改查都是用的json
elastic | mysql |
---|---|
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