1. 程式人生 > >ES學習(一)構建查詢

ES學習(一)構建查詢

一、建立介面

package com.ht.service.fsp.demo.service;

import com.ht.service.fsp.demo.domain.DemoType;
import com.ht.service.fsp.demo.vo.DemoVo;

/**
 * 介面DEMO
 */
public interface DemoService {

    /**
     * 暴露的dubbo介面demo
     *
     * @param demoType 列舉資訊
     * @return 返回資料
     */
    DemoVo getDemoVoInfo(DemoType demoType);

}

二、建立實現類

package com.ht.service.fsp.demo.provider;

import com.alibaba.fastjson.JSON;
import com.ht.service.fsp.demo.domain.DemoType;
import com.ht.service.fsp.demo.mapper.DemoMapper;
import com.ht.service.fsp.demo.service.DemoPrivateService;
import com.ht.service.fsp.demo.service.DemoService;
import
com.ht.service.fsp.demo.vo.DemoVo; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import
org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.sort.SortOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; @Service("demoService") public class DemoServiceImpl implements DemoService { private static final Logger LOGGER = LoggerFactory.getLogger(DemoServiceImpl.class); @Autowired private DemoMapper demoMapper; @Autowired private DemoPrivateService demoPrivateService; @Autowired private ElasticsearchTemplate elasticsearchTemplate; /** * 實現dubbo介面方法 * * @param demoType 列舉資訊 * @return */ @Override public DemoVo getDemoVoInfo(DemoType demoType) { LOGGER.info("呼叫dubbo介面實現方法"); //呼叫私有服務 Map<String, Object> param = new HashMap<>(); param = demoPrivateService.getDemoPrivateInfo(param); // 針對資料庫的操作 LOGGER.info("針對資料庫的操作"); param.put("name", "liuchen"); param.put("age", "24"); demoMapper.insert(param); LOGGER.info("插入方法:id=" + param.get("id").toString()); param = demoMapper.getOne(param.get("id").toString()); LOGGER.info("查詢方法:" + JSON.toJSONString(param)); param.put("name", "liuchen"); param.put("age", "25"); demoMapper.update(param); LOGGER.info("更新方法:" + JSON.toJSONString(param)); demoMapper.delete(param.get("id").toString()); LOGGER.info("刪除方法:" + JSON.toJSONString(param)); List<Map<String, Object>> mapList = demoMapper.getAll(); LOGGER.info("查詢全部方法:" + JSON.toJSONString(mapList)); //針對ES的操作 LOGGER.info("ES"); //使用查詢新增搜尋條件:不快取效能慢計算相關度 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //must是同時滿足 boolQueryBuilder.must(QueryBuilders.termQuery("main_pty_mng", "002332")); //should是滿足其一 boolQueryBuilder.should(QueryBuilders.matchQuery("brok_org_id", "ZZ001041051")); //matchQuery是帶分詞功能的全文搜尋 boolQueryBuilder.must(QueryBuilders.matchQuery("user_rights", "817170")); //termQuery是不帶分詞功能的精準匹配 boolQueryBuilder.should(QueryBuilders.termQuery("telephone", "18205185813")); //反相匹配 boolQueryBuilder.mustNot(QueryBuilders.termQuery("telephone", "123123123123")); //過濾器filter:快取效能快不計算相關度 boolQueryBuilder.filter(QueryBuilders.matchQuery("user_rights", "817170")); boolQueryBuilder.filter(QueryBuilders.termQuery("telephone", "18205185813")); //聚合函式 //高階內容.......這裡沒有用到 //複雜物件nested物件 //高階內容.......這裡沒有用到 //獲取連線建立搜尋 Client client = elasticsearchTemplate.getClient(); //指定index和type SearchRequestBuilder searchRequestBuilder = client.prepareSearch("customerinfo").setTypes("customerinfo").setQuery(boolQueryBuilder); //新增排序列 searchRequestBuilder.addSort("brok_id", SortOrder.DESC); searchRequestBuilder.addSort("telephone", SortOrder.ASC); //獲取查詢條件 LOGGER.info("查詢條件:" + searchRequestBuilder.toString()); //設定from to分頁 //QUERY_THEN_FETCH:查詢是針對所有的塊執行的,但返回的是足夠的資訊,而不是文件內容(Document)。結果會被排序和分級,基於此,只有相關的塊的文件物件會被返回。由於被取到的僅僅是這些,故而返回的hit的大小正好等於指定的size。這對於有許多塊的index來說是很便利的(返回結果不會有重複的,因為塊被分組了)。 //QUERY_AND_FETCH:最原始(也可能是最快的)實現就是簡單的在所有相關的shard上執行檢索並返回結果。每個shard返回一定尺寸的結果。由於每個shard已經返回了一定尺寸的hit,這種型別實際上是返回多個shard的一定尺寸的結果給呼叫者。 // DFS_QUERY_THEN_FETCH:與QUERY_THEN_FETCH相同,預期一個初始的散射相伴用來為更準確的score計算分配了的term頻率。 //DFS_QUERY_AND_FETCH:與QUERY_AND_FETCH相同,預期一個初始的散射相伴用來為更準確的score計算分配了的term頻率。 //SCAN:在執行了沒有進行任何排序的檢索時執行瀏覽。此時將會自動的開始滾動結果集。 //COUNT:只計算結果的數量,也會執行facet。 //setFrom((pageNo-1)*pageSize).setSize(pageSize) searchRequestBuilder.setSearchType(org.elasticsearch.action.search.SearchType.QUERY_THEN_FETCH).setFrom(0 * 10).setSize(10); //查詢並獲取結果 SearchResponse response = searchRequestBuilder.execute().actionGet(); SearchHits hits = response.getHits(); //獲取結果總條數 Long count = hits.getTotalHits(); LOGGER.info("總條數:" + count); //迴圈獲取每個記錄資料 int i = 0; for (SearchHit searchHit : hits) { //將每條記錄轉成一個map Map<String, Object> m = searchHit.getSource(); i++; LOGGER.info("NO." + i + ":" + JSON.toJSONString(m)); } LOGGER.info("查詢ES"); return new DemoVo(); } }