共計 7241 個字符,預計需要花費 19 分鐘才能閱讀完成。
丸趣 TV 小編給大家分享一下 ELASTICSEARCH 如何實現 JAVA 的增刪改查,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
操作 ES 的對象:TransportClient
!--elasticsear 使用的 jar --
dependency
groupId org.elasticsearch.client /groupId
artifactId transport /artifactId
version ${elasticsearch.client.version} /version
/dependency
!--elasticsear 使用的 jar --
我的版本是 5.4.0
創建 TransportClient 對象
我是使用 spring 的 bean 注入的
@SuppressWarnings(resource)
@Bean(name= transportClient)
@Lazy
public TransportClient getTransportClient(){
TransportClient client =null;
try{ Settings settings= Settings.builder().put(cluster.name , elasticsearch).build();
client=new PreBuiltTransportClient(settings).addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName( 192.168.0.11),9300));
log.info( 創建 es 客戶端對象成功
}catch(Exception e){
log.error( 創建 es 客戶端對象失敗
log.error(失敗原因: +e.getMessage());
System.exit(-1);
}
return client;
}
創建對象那個成功后,就可以用來操作 es 庫了,他的作用跟 spring-jdbctemplate,spring-jdbctemplate 一樣,提供了對數據庫增刪改查的功能,
spring 也提供了對 es 操作的對象叫 Spring Data Elasticsearch
參考文檔:
http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa
我用的就是 es 自己提供的對象 TransportClient
添加數據
es 的添加數據提供了多種方法,跟 hql 語言有點相似,都是面向對象的。
es 支持批量操作的方法,為了提供效率都是用批量的對象
BulkRequestBuilder builder=transportClient.prepareBulk();
BulkRequestBuilder 對象有一個地方需要注意,因為是批量操作,es 忽略了數據的不正確性,就算你的數據不對,builder 也不會報錯,所以在調試階段需要先確保數據的準確性再用該對象進行操作。
插入數據,其實只需要把你的對象轉成 json,然后批量插入即可
@Override
public void batchAddMyZu(List Family list) { BulkRequestBuilder builder=transportClient.prepareBulk();
for(Family family:list){ String objstr= JSON.toJSONString(family);
builder.add(client.prepareIndex( family , myfamily ,family.getPrimaryKey()).setSource(objstr, XContentType.JSON));
}
builder.execute().actionGet();
System.out.println(此次插入數據的個數是 +list.size());
}
setSource 方法里面可以指定各種插入類型,我一般都是用 json 格式。
刪除操作
es 可以通過指定 index,type,id 刪除數據,也支持搜索刪除 deleteByQuery
通過指定 id 刪除方法
@Override
public void batchUndercarriageFamilies(List String publishIds) { BulkRequestBuilder builder=transportClient.prepareBulk();
for(String publishId:publishIds){ builder.add(transportClient.prepareDelete(FAMILY, FAMILY_MARKETFAMILY, publishId).request());
}
builder.get();}
通過 deleteByQuery 刪除
@Override
public void delMyZu(String guid, String userId) { DeleteByQueryAction.INSTANCE.newRequestBuilder(transportClient)
.source(FAMILY)
.filter(QueryBuilders.boolQuery().must(QueryBuilders.termQuery( zuGUID , guid)).must(QueryBuilders.termQuery( userId , userId)).must(QueryBuilders.typeQuery(FAMILY_MYFAMILY)))
.get();}
QueryBuilder 對象可以做任何查詢
修改操作
我現在修改是根據指定索引后然后修改指定字段醬樣的
@Override
public void updateMyZu_Related4MyZuValue(List Related4MyZuValue list) { BulkRequestBuilder builder=transportClient.prepareBulk();
for(Related4MyZuValue value:list){
try { XContentBuilder source=XContentFactory.jsonBuilder().startObject()
.field(related4ZuValue ,value.getRelated4ZuValue())
.field(zuSalePrice ,value.getZuSalePrice())
.endObject();
builder.add(transportClient.prepareUpdate(FAMILY, FAMILY_MYFAMILY, value.getPrimaryKey()).setDoc(source));
} catch (IOException e) {
continue;
}
}
builder.get();}
我這種操作是執行 id 后修改該數據的 related4ZuValue 的值和 zuSalePrice 的值
查詢操作
es 最主要功能就是查詢
QueryBuilder 就是設置查詢條件的對象,你可以通過他設置各種條件
隨便貼幾個,自己感受吧。。。。
BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
if(keyword!=null !keyword.equals()){ QueryBuilder nameBuilder=QueryBuilders.matchQuery( zuName , keyword).analyzer(ik_max_word).boost(10);
QueryBuilder labelBuilder=QueryBuilders.matchQuery(zuLabelName , keyword).analyzer(ik_max_word).boost(10);
QueryBuilder categoryBuilder=QueryBuilders.matchQuery(categoryName , keyword).analyzer(ik_max_word).boost(10);
boolQueryBuilder.should(nameBuilder).should(labelBuilder).should(categoryBuilder);
}else{ boolQueryBuilder.must(QueryBuilders.matchAllQuery());
SearchResponse response=transportClient.prepareSearch(FAMILY).setTypes(FAMILY_MARKETFAMILY)
.setQuery(boolQueryBuilder)
.setFrom((page-1)*pageSize).setSize(pageSize)
.setExplain(true)
.get();
SearchHits hits=response.getHits();
BoolQueryBuilder builders=new BoolQueryBuilder();
// 加上條件
builders.must(QueryBuilders.termQuery( userId , userId));
if(relatedValue==RelatedValue.MyBuyerZu.value()){
builders.must(QueryBuilders.nestedQuery( related4ZuValue ,
QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery( related4ZuValue.nameValue , UserReltatedValueUtil.getUserRelatedValue(relatedValue)))
//.must(QueryBuilders.rangeQuery( endTime).lte(LongformStringDate(System.currentTimeMillis())))
,ScoreMode.None));
}else{ builders.must(QueryBuilders.nestedQuery( related4ZuValue , QueryBuilders.termQuery( related4ZuValue.nameValue , UserReltatedValueUtil.getUserRelatedValue(relatedValue)),
ScoreMode.None));
SearchResponse response=transportClient.prepareSearch(FAMILY).setTypes(FAMILY_MYFAMILY)
.setQuery(builders).setFrom((page-1)*pageSize)
.setSize(pageSize)
.get();
SearchHits hits=response.getHits();
@Override
public MarketFamily getMarketFamily(String guid) { MarketFamily marketFamily=new MarketFamily();
SearchResponse response=transportClient.prepareSearch(FAMILY)
.setTypes(FAMILY_MYFAMILY).setQuery(QueryBuilders.termQuery( zuGUID , guid))
.setSize(1)
.get();
SearchHits hits=response.getHits();
for(SearchHit hit:hits.getHits()){ marketFamily=JSON.parseObject(hit.getSourceAsString(),MarketFamily.class);
}
return marketFamily;
}
取查詢結果總和 count
@Override
public long countMyAllZu(String userId, int relatedValue) { BoolQueryBuilder builders=new BoolQueryBuilder();
builders.must(QueryBuilders.termQuery( userId , userId));
if(relatedValue==RelatedValue.MyBuyerZu.value()){
builders.must(QueryBuilders.nestedQuery( related4ZuValue ,
QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery( related4ZuValue.nameValue , UserReltatedValueUtil.getUserRelatedValue(relatedValue)))
.must(QueryBuilders.rangeQuery( endTime).lte(LongformStringDate(System.currentTimeMillis())))
,ScoreMode.None));
}else{ builders.must(QueryBuilders.nestedQuery( related4ZuValue , QueryBuilders.termQuery( related4ZuValue.nameValue , UserReltatedValueUtil.getUserRelatedValue(relatedValue)),
ScoreMode.None));
}
SearchResponse response=transportClient.prepareSearch(FAMILY).setTypes(FAMILY_MYFAMILY)
.setQuery(builders)
.setSize(1)
.get();
SearchHits hits=response.getHits();
return hits.getTotalHits();}
聚合求和 sum
@Override
public long getPlatformZuOrdersTotalAmount(String keyword,String startTime,String endTime) { BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
if(keyword==null||keyword.equals()){ QueryBuilder queryBuilder=QueryBuilders.matchAllQuery();
boolQueryBuilder.must(queryBuilder);
}else{ QueryBuilder zuNameBuilder=QueryBuilders.matchQuery( zuName , keyword);
QueryBuilder buyerNameBuilder=QueryBuilders.matchQuery(buyerName , keyword);
QueryBuilder sellerNameBuilder=QueryBuilders.matchQuery(sellerName , keyword);
boolQueryBuilder.should(zuNameBuilder).should(buyerNameBuilder).should(sellerNameBuilder);
}
if(!startTime.equals()){ QueryBuilder addTimeBuilder=QueryBuilders.rangeQuery( addTime).from(startTime).to(endTime);
boolQueryBuilder.must(addTimeBuilder);
}
SearchResponse response=transportClient.prepareSearch(FAMILY).setTypes(FAMILY_FAMILYORDER)
.setQuery(boolQueryBuilder)
.addAggregation(AggregationBuilders.sum( price).field(price))
.get();
Sum sum=response.getAggregations().get( price
return (long) sum.getValue();}
以上是“ELASTICSEARCH 如何實現 JAVA 的增刪改查”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!