Elasticsearch+hbase 實現hbase中資料的快速查詢(三)
阿新 • • 發佈:2019-01-26
前2篇介紹了Elasticsearch的安裝和工具類,雖然這樣能用,但是還留有幾個問題,對此有些困擾.
- 多條件查詢
工具類裡面有個get精確查詢和search搜尋,但是那個只用來查詢單一條件,如果查詢介面上需要查詢多個條件,那這個顯然不夠用.在網路上搜索了半天,發現沒有比較好的java寫的api參考,覺得有些奇怪,難道這種場景不常見嗎?
官方文件中,有類似搜尋api,比如MultiSearch ,但感覺有些奇怪.
一般常見的需求是, 開發者不知道具體查詢條件有多少個,因此,不能在工具類裡面寫死查詢條件個數.尋找半天,發現有個Must 查詢,仔細一看,發現能夠滿足這樣的需求.程式碼如下:
/**
* @Title: getSearchResponse
* @Description: TODO(查詢資料,多條件查詢,有分頁)
* @param: @throws Exception
* @return: void
* @throws
*/
public static Map<String, Object> getSearchResponse(String indexName, String type, Map<String, Object> requestParams) throws Exception{
Map <String, Object> resultMap = new HashMap<String, Object>();
Map<String, String> queryCondition = new HashMap<String, String>();
Map<String, String> filterCondition = new HashMap<String, String>();
//查詢條件
queryCondition = (Map<String , String>) requestParams.get("queryParams");
//過濾條件
filterCondition = (Map<String, String>) requestParams.get("filterParams");
setUp();
boolean matchQueryFlag = true;
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(indexName)
.setTypes(type)
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.matchAllQuery());//查詢所有
for (Entry<String, String> conditionEach : queryCondition.entrySet()) {
//如果某個查詢欄位有值,則matchQueryFlag = false
if(!"".equals(conditionEach.getValue())&&conditionEach.getValue() != null){
matchQueryFlag = false;
//----------------------------------------
searchRequestBuilder.setQuery(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery(conditionEach.getKey(), conditionEach.getValue())));
}
}
SearchResponse response = searchRequestBuilder
.setFrom(Integer.parseInt(""+requestParams.get("startRow"))).setSize(Integer.parseInt(""+requestParams.get("rowCount"))).setExplain(false) //true,有結果解釋;false,沒有
.get();
closeClient();
// 輸出結果
JSONArray dataArr = new JSONArray();
SearchHits hits = response.getHits();
for (SearchHit searchHit : hits) {
System.out.println(searchHit.getSourceAsString());
Map<String, Object> source = searchHit.getSource();
Map<String, Object> mapObject = new HashMap<String, Object>();
mapObject.put("id", source.get("rowKey"));
dataArr.add(mapObject);
}
System.out.println(response.toString());
resultMap.put("queryStatus", "1001");
resultMap.put("queryDataDesc", "");
// 獲取查詢的條數
resultMap.put("queryDataCount", response.getHits().totalHits());
resultMap.put("queryDataContent", dataArr);
return resultMap;
}
中文查詢,匹配查詢
ES搜尋功能是比較強大的,比如有權重分析,關聯強弱分析等,對中文也有很好支援.中文分詞也不差.不過,本人這裡的需求只是一般意義上的匹配查詢,並不是類似百度搜索那樣的匹配,目前Must查詢就是這樣的情況,看來,針對中文匹配查詢,還需要另作處理.查詢分頁,預設不分頁的情況
會有遇到不分頁的情況,比如資料匯出功能.之前在solr,可以將pageCount 設成很大,ES這裡,提示最大是10000,這應該是查詢視窗的區間大小(遊標的大小),感覺應該可以修改該設定,以滿足要求.連線ESClient耗時問題
ES本身查詢速度很快,一般幾百條的索引,查詢耗時在0,01秒上.有些奇怪的是,連線Client比較耗時,應該是連線一次,就一直保持連線的,現在是查詢一次,連線一次.這個應該要改正.目前在做別的事情,有空再看下官網資料.