1. 程式人生 > >ElasticSearch 5.3 java API 查詢

ElasticSearch 5.3 java API 查詢

關於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()