1. 程式人生 > >ElasticSearch封裝查詢、多條件查詢、模糊查詢工具類

ElasticSearch封裝查詢、多條件查詢、模糊查詢工具類

這個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;
	}
}