elasticsearchs搜索 工具类
增删改查
package com.mr.utils;
import java.lang.reflect.Field;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.util.StringUtils;
public class EsUtil {
public final static String HOST = "127.0.0.1";
public final static int PORT = 9300; //http请求的端口是9200,客户端是9300
private static TransportClient client = null;
/**
* 获取客户端连接信息
* @Title: getConnect
* @author sunt
* @date 2017年11月23日
* @return void
* @throws UnknownHostException
*/
public static void getConnect(){
try {
client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddresses(
new TransportAddress(InetAddress.getByName(HOST),PORT));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 关闭连接
* @Title: closeConnect
* @author sunt
* @date 2017年11月23日
* @return void
*/
public static void closeConnect() {
if(null != client) {
client.close();
}
}
/**
* 创建索引-传入Map对象
* @Title: addIndex3
* @author sunt
* @date 2017年11月23日
* @return void
*/
// public static void addIndexToMap(String indexName,String typeName,Map map) {
// EsUtil.getConnect();
// IndexResponse response = client.prepareIndex(indexName, typeName).setSource(map).get();
// EsUtil.closeConnect();
// }
/**
* 转Map
* @param obj
* @return
*/
public static Map<String, Object> objMap(Object obj) {
Map<String, Object> map = new HashMap<String, Object>();
if (obj == null) {
return map;
}
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
map.put(field.getName(), field.get(obj));
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
/**
* 添加索引:传入json字符串
* @Title: addIndex2
* @author sunt
* @date 2017年11月23日
* @return void
*/
public static void addIndexToJson(String indexName,String typeName,String id,String jsonStr) {
getConnect();
IndexResponse response = client.prepareIndex(indexName, typeName,id).setSource(jsonStr,XContentType.JSON).get();
closeConnect();
}
/**
* 根据索引名称,类别,文档ID 删除索引库的数据
* @Title: deleteData
* @author sunt
* @date 2017年11月23日
* @return void
*/
public static void deleteData(String indexName,String typeName,String id) {
getConnect();
DeleteResponse deleteResponse = client.prepareDelete(indexName, typeName, id).get();
closeConnect();
}
/**
* 修改
*/
public static void updateData(String indexName,String typeName,String id,Map map) {
getConnect();
UpdateResponse updateResponse = client.prepareUpdate(indexName, typeName, id)
.setDoc(map).get();
closeConnect();
}
/**
* 获取数据
*/
public static Map getDataById(String indexName,String typeName,String id) {
getConnect();
GetResponse getResponse = client.prepareGet(indexName, typeName, id).get();
closeConnect();
return getResponse.getSourceAsMap();
}
// public static void main(String[] args) {
// Map map = EsUtil.getDataById("msg", "tweet", "2");
// System.out.println(map);
// }
/**
* 复合查询
* @return
*/
public static List<Map<String, Object>> getIndexsForList(String indexName,String typeName,String highFiledName,Map<String,Object> mustMap,Integer start ,Integer end) {
getConnect();
/**
* 执行搜索(带高亮)
* @param indexname 索引名称
* @param type 索引类型
* @param queryBuilder 查询条件
* @param highFileName 高亮字段
* @return
*/
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//如果传入条件 mustMap 拼接条件对象
if(mustMap != null) {
//循环map将key作为字段名,value作为值进行比较
for(String key:mustMap.keySet()) {
boolQuery.must(QueryBuilders.matchPhraseQuery(key,mustMap.get(key)));
}
}
//范围查询
// RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("userAge")
// .from(18).to(20);
// boolQuery.filter(rangeQueryBuilder);
SearchRequestBuilder builder = null;
builder = client.prepareSearch(indexName)
.setTypes(typeName)
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(boolQuery);
//设置高亮 高亮变量
if(!StringUtils.isEmpty(highFiledName)) {
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>");//设置前缀
highlightBuilder.postTags("</font>");//设置后缀
highlightBuilder.field(highFiledName);//设置高亮字段
builder.highlighter(highlightBuilder);
}
//设置分页
if(start!=null && start>-1) {
builder.setFrom(start);
}
if(end!=null && end>-1) {
builder.setFrom(end);
}
SearchResponse response = builder.get();
List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
//response:结果对象 循环结果对象
for(SearchHit hit:response.getHits()){
//getSourceAsMap 获得源代码改成map
Map map = hit.getSourceAsMap();
if(!StringUtils.isEmpty(highFiledName)) {
map.put(highFiledName, String.valueOf(hit.getHighlightFields().get(highFiledName).fragments()[0]));
}
list.add(map);
}
System.out.println(list);
closeConnect();
return list;
}
}
第一次发,有什么的请多指教~~