1. 程式人生 > >Elasticsearch+hbase 實現hbase中資料的快速查詢(三)

Elasticsearch+hbase 實現hbase中資料的快速查詢(三)

前2篇介紹了Elasticsearch的安裝和工具類,雖然這樣能用,但是還留有幾個問題,對此有些困擾.

  1. 多條件查詢
    工具類裡面有個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; }
  1. 中文查詢,匹配查詢
    ES搜尋功能是比較強大的,比如有權重分析,關聯強弱分析等,對中文也有很好支援.中文分詞也不差.不過,本人這裡的需求只是一般意義上的匹配查詢,並不是類似百度搜索那樣的匹配,目前Must查詢就是這樣的情況,看來,針對中文匹配查詢,還需要另作處理.

  2. 查詢分頁,預設不分頁的情況
    會有遇到不分頁的情況,比如資料匯出功能.之前在solr,可以將pageCount 設成很大,ES這裡,提示最大是10000,這應該是查詢視窗的區間大小(遊標的大小),感覺應該可以修改該設定,以滿足要求.

  3. 連線ESClient耗時問題
    ES本身查詢速度很快,一般幾百條的索引,查詢耗時在0,01秒上.有些奇怪的是,連線Client比較耗時,應該是連線一次,就一直保持連線的,現在是查詢一次,連線一次.這個應該要改正.目前在做別的事情,有空再看下官網資料.