其實在上一篇博客中,只要你們能看懂,就應該能夠根據其代碼作到舉一反三了,依次類推ES的批量操做Bulk,搜索功能Search等,但在這裏還是簡單講一下。
批量索引和刪除
Java代碼 收藏代碼
BulkRequestBuilder bulkRequest = client.prepareBulk();
for(int i=500;i<1000;i++){
//業務對象
String json = ESUtils.toJson(new LogModel());
IndexRequestBuilder indexRequest = client.prepareIndex("twitter", "tweet")
//指定不重複的ID
.setSource(json).setId(String.valueOf(i));
//添加到builder中
bulkRequest.add(indexRequest);
}
BulkResponse bulkResponse = bulkRequest.execute().actionGet();
if (bulkResponse.hasFailures()) {
// process failures by iterating through each bulk response item
System.out.println(bulkResponse.buildFailureMessage());
}
上面只是批量索引的方法,將client.prepareIndex改爲client.prepareDelete就是批量刪除操做。ES對批量操做做了優化,因此你們使用時,盡量將操做集中起來調用批量接口,速度會更快一些。
搜索(Search)
這裏說的搜索僅僅是簡單相等條件搜索,並沒有涉及真正意義上的搜索。好比,我們要搜索前1000條記錄,代碼以下:
Java代碼 收藏代碼
SearchResponse response = client.prepareSearch("twitter")
//這個在prepareSearch中指定還不行,必須使用setTypes
.setTypes("tweet")
//設置查詢條件,
.setFilter(FilterBuilders.matchAllFilter())
.setFrom(0).setSize(1000)
.execute()
.actionGet();
/**
* SearchHits是SearchHit的複數形式,表示這個是一個列表
*/
SearchHits shs = response.getHits();
for(SearchHit hit : shs){
System.out.println("id:"+hit.getId()+":"+hit.getSourceAsString());
}
client.close();
搜索有兩種方法,一種是使用Filter進行搜索,一種是使用Query進行搜索,例如,想只搜索某個字段爲具體值的數據,也能夠這樣寫。
Java代碼 收藏代碼
Client client = ESUtils.getClient();
/**
* 創建查詢條件,QueryBuilders相當於Hibernate的Restrictions,
* 而QueryBuilder則相當於一個Criteria,能夠不停的增長自己對象
*/
BoolQueryBuilder query = QueryBuilders.boolQuery();
//systemName爲字段名稱,oa未字段值
query.must(QueryBuilders.termQuery("systemName", "oa"));
SearchResponse response = client.prepareSearch("twitter")
//這個在prepareSearch中指定還不行,必須使用setTypes
.setTypes("tweet")
//設置查詢條件,
.setQuery(query)
.setFrom(0).setSize(60)
.execute()
.actionGet();
/**
* SearchHits是SearchHit的複數形式,表示這個是一個列表
*/
SearchHits shs = response.getHits();
for(SearchHit hit : shs){
System.out.println(hit.getSourceAsString());
}
client.close();
這些只是使用ES的傳統用法,就是想用ES取代傳統數據庫的用法。但其實ES的主要目的並非如此,相信你使用搜索引擎也不是想作這些簡單的查詢和插入。排名,分詞等更高級的用法,我也沒有徹底搞清楚,還望你們多多指教。json