ElasticSearch java客户端使用

1、maven repository

		<!-- elastic search -->
		<dependency>
			<groupId>org.elasticsearch</groupId>
			<artifactId>elasticsearch</artifactId>
			<version>0.19.11</version>
		</dependency>
		<!-- gson -->
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.2.3</version>
		</dependency>

2、client

			logger.info("正在初始化搜索引擎...");
			
			//searchClient =  new TransportClient().addTransportAddress(new InetSocketTransportAddress("192.168.0.2", 9300));
			searchClient = nodeBuilder().clusterName(CLUSTERNAME).client(true).node().client();


3、index

		Gson gson = getGsonInstance();
		String source = gson.toJson(obj); 
		searchClient.prepareIndex(INDEX, indexName,String.valueOf(id)).setSource(source).execute().actionGet();
		logger.info(indexName+":成功新建索引"+id);

4、search

if(logger.isDebugEnabled()){
			logger.debug(qb.toString());
		}
		SearchResponse responese = searchClient.prepareSearch(INDEX).setTypes(indexName).setQuery(qb).execute().actionGet();
		Long totalRows = responese.getHits().getTotalHits();
		if(totalRows>0){
			return getObjectList(cls,responese);
		}else{
			return new ArrayList<T>(); 
		}


5、get

GetResponse response = searchClient.prepareGet(INDEX, indexName, String.valueOf(id)).execute().actionGet();
		if(response.exists()){
			Gson gson = getGsonInstance();
			String source = response.sourceAsString();
			logger.info(indexName+":获得实体"+id);
			return gson.fromJson(source, cls);
		}else{
			logger.info(indexName+":获得实体"+id+"失败");
			return null;
		}


6、delete

	searchClient.prepareDelete(INDEX, indexName, String.valueOf(id)).execute();
	logger.info(indexName+":删除对象"+id);

7、util

	private static Gson getGsonInstance(){
		return new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").disableHtmlEscaping().create();  
	}
private static void getQueryBuilder(Object obj,String source ,BoolQueryBuilder qb) throws Exception{
		//obj is a standard JavaBean
		BeanUtilsBean beanUtils = BeanUtilsBean.getInstance();
	    PropertyDescriptor[] origDescriptors = beanUtils.getPropertyUtils().getPropertyDescriptors(obj);
	    for (int i = 0; i < origDescriptors.length; i++) {
	    	   String name = origDescriptors[i].getName();
	    	 if ("class".equals(name)||name.startsWith("noSerach")) {
	    		 continue; // No point in trying to set an object's class
	    	 }
	    	 if (beanUtils.getPropertyUtils().isReadable(obj, name)){
	    		 Object value = beanUtils.getPropertyUtils().getSimpleProperty(obj, name);
	    		 if(name.endsWith("0")){//范围搜索
	    			 String field = name.substring(0, name.indexOf('0'));
	    			 Object value1 = beanUtils.getPropertyUtils().getSimpleProperty(obj, field+"1");
	      			 if(value==null&&value1==null){//条件为空,不搜索
	    				 continue;
	    			 }
	      			 Object obj0 =value;
	      			 Object obj1 = value1;
	      			 if(value!=null && value instanceof Date){
	      				obj0 = DateConverter.dateFormat((Date)value,"yyyy-MM-dd'T'00:00:00.001'Z'");
	      			 }
	      			 if(value1!=null && value1 instanceof Date){
	      				obj1 = DateConverter.dateFormat((Date)value1,"yyyy-MM-dd'T'23:59:59.001'Z'");
	      			 }
	      			 
	      			RangeQueryBuilder range =  rangeQuery(field).from(obj0).to(obj1);
	    			 qb.must(range);
	    		 }else if(name.endsWith("1")){
	    			 continue;
	    		 }else if(value!=null&&!(value instanceof Collection)){
	 	    			if (name.equals("kw")){// 当name是kw时,组成(关建字)搜索语句
	 	    				if(!"".equals(value)){
		    				String kw = (String)value;
		    				StringBuffer sb = new StringBuffer();
		    				String [] strs = kw.trim().split(" ");
		    				for(int k = 0 ;strs.length>k;k++){
		    					if(k>0){
		    						sb.append(" AND ");
		    					}
		    					sb.append("\"");
		    					sb.append(strs[k]);
		    					sb.append("\"");
		    				}
		    				 QueryStringQueryBuilder queryString = queryString(sb.toString()).defaultOperator(QueryStringQueryBuilder.Operator.AND);
		    				 qb.must(queryString);
	 	    				}
	    			 }else if(name.startsWith("kw_")){
	 	    				if(!"".equals(value)){
		    				String kw = (String)value;
		    				StringBuffer sb = new StringBuffer();
		    				String [] strs = kw.trim().split(" ");
		    				for(int k = 0 ;strs.length>k;k++){
		    					if(k>0){
		    						sb.append(" AND ");
		    					}
		    					sb.append("\"");
		    					sb.append(strs[k]);
		    					sb.append("\"");
		    				}
		    				 QueryStringQueryBuilder queryString = queryString(sb.toString()).defaultOperator(QueryStringQueryBuilder.Operator.AND);
		    				 if(!"".equals(source)){
		    					 queryString.field(source+name.replace("kw_", "*"));
		    				 }
		    				 qb.must(queryString);
	 	    				}
	    			 }else if(value instanceof String){ //当name不是kw并同时是字符串时,组成(字符串类)搜索语句,
	    				 if(!"".equals(value)){
	    					 qb.must(queryString(source+name+":\""+value+"\""));
	    				 }
	    			 }else if(((value instanceof Integer)&&!value.equals(-1))||(value instanceof Boolean)){ //当name是数字型时,组成数字型的搜索语句,例如年龄或者枚举
	    				 qb.must(termQuery(source+name,value));
	    			 }else{
	    				 getQueryBuilder(value,source+name+".",qb);
	    			 }
	    			 
	    		 }
	    	 }
	    }
	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值