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);
}
}
}
}
}