ES學習(一)構建查詢
阿新 • • 發佈:2019-01-29
一、建立介面
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();
}
}