ElasticSearch封裝查詢、多條件查詢、模糊查詢工具類
阿新 • • 發佈:2019-02-10
這個EsTool類是根據自身業務寫成的,因為業務暫時想法不難。
需要的主要是:1、精確查詢 (單/多條件)
2、模糊查詢 (單/多條件)
前提:Mapping全部設定"index":"not_analys",阻止分詞器去進行分析字串從而達到精確查詢的效果。
public class EsTool { public String index ="gtbdc2"; public TransportClient getClient(){ try { //設定叢集名稱 Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build(); //建立client @SuppressWarnings({ "resource", "unchecked" }) TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("0.0.0.0"), 9300)); return client; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); return null; } } /** * 根據文件名、欄位名、欄位值查詢某一條記錄的詳細資訊;query查詢 * @param type 文件名,相當於oracle中的表名,例如:ql_xz; * @param key 欄位名,例如:bdcqzh * @param value 欄位值,如:“” * @return List * @author Lixin */ public List getQueryDataBySingleField(String type,String key,String value){ TransportClient client = getClient(); QueryBuilder qb = QueryBuilders.termQuery(key, value); SearchResponse response = client.prepareSearch(index).setTypes(type) .setQuery(qb) .setFrom(0).setSize(10000).setExplain(true) .execute() .actionGet(); return responseToList(client,response); } /** * 多條件 文件名、欄位名、欄位值,查詢某一條記錄的詳細資訊 * @param type 文件名,相當於oracle中的表名,例如:ql_xz * @param map 欄位名:欄位值 的map * @return List * @author Lixin */ public List getBoolDataByMuchField(String type,Map<String,String> map){ TransportClient client = getClient(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); for (String in : map.keySet()) { //map.keySet()返回的是所有key的值 String str = map.get(in);//得到每個key多對用value的值 boolQueryBuilder.must(QueryBuilders.termQuery(in,str)); } SearchResponse response = client.prepareSearch(index).setTypes(type) .setQuery(boolQueryBuilder) .setFrom(0).setSize(10000).setExplain(true) .execute() .actionGet(); return responseToList(client,response); } /** * 單條件 模糊查詢 * @param type 文件名,相當於oracle中的表名,例如:ql_xz * @param key 欄位名,例如:bdcqzh * @param value 欄位名模糊值:如 *123* ;?123*;?123?;*123?; * @return List * @author Lixin */ public List getDataByillegible(String type,String key,String value){ TransportClient client = getClient(); WildcardQueryBuilder wBuilder = QueryBuilders.wildcardQuery(key, value); SearchResponse response = client.prepareSearch(index).setTypes(type) .setQuery(wBuilder) .setFrom(0).setSize(10000).setExplain(true) .execute() .actionGet(); return responseToList(client,response); } /** * 多條件 模糊查詢 * @param type type 文件名,相當於oracle中的表名,例如:ql_xz * @param map 包含key:value 模糊值鍵值對 * @return List * @author Lixin */ public List getDataByMuchillegible(String type,Map<String,String> map){ TransportClient client = getClient(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); for (String in : map.keySet()) { //map.keySet()返回的是所有key的值 String str = map.get(in);//得到每個key多對用value的值 boolQueryBuilder.must(QueryBuilders.wildcardQuery(in,str)); } SearchResponse response = client.prepareSearch(index).setTypes(type) .setQuery(boolQueryBuilder) .setFrom(0).setSize(10000).setExplain(true) .execute() .actionGet(); return responseToList(client,response); } /** * 將查詢後獲得的response轉成list * @param client * @param response * @return */ public List responseToList(TransportClient client,SearchResponse response){ SearchHits hits = response.getHits(); List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); for (int i = 0; i < hits.getHits().length; i++) { Map<String, Object> map = hits.getAt(i).getSource(); list.add(map); } client.close(); return list; } }