ElasticSearch 5.3 java API 查詢
阿新 • • 發佈:2019-02-17
關於ElasticSearch的index建立在這裡已經介紹了。
根據id查詢資料:
//根據id查詢的話使用IdsQueryBuilder來新增id
IdsQueryBuilder queryBuilder = QueryBuilders.idsQuery();
queryBuilder.addIds(orgId);
SearchResponse response = client.prepareSearch(orgIndexName).setTypes(orgTypeName).setQuery(queryBuilder).get();
//查詢所獲取的資料都在hits裡面,是以資料的形式,每一個hits[?]裡面都有很多其他資料
SearchHit[] hits = response.getHits ().getHits();
if(Utils.isEmpty(hits)){
return null;
}
//通過getSourceAsString就可獲取資料的json格式
return JSON.parseObject(hits[0].getSourceAsString(), OrgESData.class);
通過條件查詢:
ElasticSearch的QueryBuilder具有這三種:must、 should、mustNot 常用的選擇,must 相當於 and 、should 相當於 or 、mustNot 相當於 not 。要注意的是當只有一個should的時候也相當於must。
// SELECT t.* FROM table t WHERE t.teamId = ?
//只有一個條件時,直接這樣寫
client.prepareSearch(orgIndexName).setTypes(orgTypeName).setQuery(QueryBuilders.termQuery("teamId", teamId)).get()
//也可以這樣,這裡 qb的must可以換成should ,效果是一樣的。
BoolQueryBuilder qb = QueryBuilders.boolQuery();
qb.must(QueryBuilders.termQuery("teamId" , teamId));
// termQuery 是代表短語、不可拆分。就是不會把你teamId拿去切詞,然後再去查,而是直接拿去查詢
SearchResponse response = client.prepareSearch(orgIndexName).setTypes(orgTypeName).setQuery(qb).get()
//SELECT * FROM table t WHERE t.orgName AND (t.orgPath = ? OR t.orgPath = ?)
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.matchQuery("orgName", keyWord));
//為了實現括號的查詢得在建立一個queryBuilder
BoolQueryBuilder queryBuilder2 = QueryBuilders.boolQuery();
for (String o : orgPaths) {
//迴圈新增,t.orgPath = ?。 Operator.AND 表示對該值全符合 Operator.OR 表示部分符合
queryBuilder2.should(QueryBuilders.matchQuery("orgPath", o).operator(Operator.AND));
}
//把queryBuilder2新增到queryBuilder裡面
queryBuilder.must(queryBuilder2);
//這裡還可設定分頁
SearchResponse response = client.prepareSearch(orgIndexName).setTypes(orgTypeName).setQuery(queryBuilder).setFrom(0).setSize(size).get()
//提取結果資料
SearchHit[] htis= response.getHits().getHits()
hits[0].getSourceAsString()