转载请注明出处,谢谢
Java操作elasticsearch
我写的一个工具类,可根据自身项目情况,做修改
package utils;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
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.UpdateRequest;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.highlight.HighlightField;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.utils.StringUtil;
import net.sf.json.JSONObject;
/**
* @author whx 下午6:52:53
* @desc elasticsearch的java工具类
*/
public class ElasticsearchTools {
private static String ip = "localhost";
private static int port = 9300;
/**
*@Title: addIndex
*@Description: TODO 单个索引增加
*@param @param object 要增加的数据
*@param @param index 索引,类似数据库
*@param @param type 类型,类似表
*@param @param id id
*@return void
*@throws
*/
public static void addDocument(JSONObject object, String index, String type, String id) {
try {
Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
IndexResponse response = client.prepareIndex(index, type, id).setSource(object).get();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*@Title: getIndex
*@Description: TODO 获取某条信息
*@param @param index
*@param @param type
*@param @param id
*@param @return
*@return Map<String,Object>
*@throws
*/
public static Map<String, Object> getDocument(String index, String type, String id) {
try {
Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
GetResponse response = client.prepareGet(index, type, id).get();
Map<String, Object> map = response.getSource();
return map;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
*@Title: delDocument
*@Description: TODO 删除某条信息
*@param @param index
*@param @param type
*@param @param id
*@return void
*@throws
*/
public static void delDocument(String index, String type, String id) {
try {
Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
DeleteResponse response = client.prepareDelete(index, type, id).get();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*@Title: delDocument
*@Description: TODO 更新某条信息 ,如果改动很多,直接用新增的也可以,只要id相同即可
*@param @param index
*@param @param type
*@param @param id
*@return void
*@throws
*/
public static void updateDocument(String index, String type, String id, String key, String value) {
try {
Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
UpdateRequest updateRequest = new UpdateRequest(index, type, id);
updateRequest.doc(XContentFactory.jsonBuilder().startObject().field(key, value).endObject());
client.update(updateRequest).get();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*@Title: getDocuments
*@Description: TODO 通过多个id,去查询一个list,暂时没有太大的用处 ,需要的话 请自己修改入参 调整
*@param @param index
*@param @param type
*@param @param id
*@param @return
*@return List<Map<String,Object>>
*@throws
*/
public static List<Map<String, Object>> getDocuments(String index, String type, String id1, String id2) {
try {
Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
//client.prepareMultiGet().add("twitter", "tweet", "1").add("twitter", "tweet", "2", "3", "4").add("another", "type", "foo").get();
MultiGetResponse multiGetItemResponses = client.prepareMultiGet().add(index, type, id1, id2).get();
List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>();
for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
GetResponse response = itemResponse.getResponse();
if (response.isExists()) {
lists.add(response.getSource());
}
}
return lists;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
*@Title: addDocuments 批量新增记录 注意 下面有个map.get(id) 也就是物理表的id
*@Description: TODO
*@param @param list
*@param @param index
*@param @param type
*@return void
*@throws
*/
public static void addDocuments(List<Map<Object, Object>> list, String index, String type) {
try {
Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
BulkRequestBuilder bulkRequest = client.prepareBulk();
for (Map<Object, Object> map : list) {
//遍历map所有field,构造插入对象
XContentBuilder xb = XContentFactory.jsonBuilder().startObject();
for (Object key : map.keySet()) {
xb.field((String) key, map.get(key));
}
xb.endObject();
//id尽量为物理表的主键
bulkRequest.add(client.prepareIndex(index, type, StringUtil.trim(map.get("id"))).setSource(xb));
}
BulkResponse bulkResponse = bulkRequest.get();
if (bulkResponse.hasFailures()) {
System.err.println("");
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*@Title: queryDocuments
*@Description: TODO
*@param @param index 相当于库
*@param @param type 想当于表
*@param @param from 记录从哪开始
*@param @param size 数量
*@param @param rangeLists 范围 参数比如价格 key为 field,from,to
*@param @param queryMaps 精确查询参数
*@param @param sortMaps 排序参数 key为 field value传大写的 ASC , DESC
* *@param @param fields 要高亮的字段
*@param @return
*@return List<Map<String,Object>>
*@throws
*/
public static List<Map<String, Object>> queryDocuments(String index, String type, int from, int size, List<Map<Object, Object>> rangeLists, Map<Object, Object> queryMaps, Map<Object, Object> sortMaps, List<String> fields, Map<Object, Object> fullTextQueryMaps) {
try {
Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>();
/** 下面这一段是构造bool嵌套,就是构造一个在满足精确查找的条件下,再去进行多字段的或者关系的全文检索 **/
//构造全文或关系的查询
BoolQueryBuilder bb = QueryBuilders.boolQuery();
if (fullTextQueryMaps != null) {
for (Object key : fullTextQueryMaps.keySet()) {
bb = bb.should(QueryBuilders.matchQuery((String) key, fullTextQueryMaps.get(key)));
}
}
//构造精确的并且查询
BoolQueryBuilder bb1 = QueryBuilders.boolQuery();
if (queryMaps != null) {
bb1 = bb1.must(bb);
for (Object key : queryMaps.keySet()) {
bb1 = bb1.must(QueryBuilders.termQuery((String) key, queryMaps.get(key)));
}
}
/** 上面这一段是构造bool嵌套,就是构造一个在满足精确查找的条件下,再去进行多字段的或者关系的全文检索 **/
//match全文检索,但是并且的关系, 或者的关系要用
/*MatchQueryBuilder tq = null;
if (queryMaps != null) {
for (Object key : queryMaps.keySet()) {
tq = QueryBuilders.matchQuery((String) key, queryMaps.get(key));
}
}*/
//term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
/* TermQueryBuilder tq = null;
if (queryMaps != null) {
for (Object key : queryMaps.keySet()) {
tq = QueryBuilders.termQuery((String) key, queryMaps.get(key));
}
}*/
//构造范围查询参数
QueryBuilder qb = null;
if (rangeLists != null && rangeLists.size() > 0) {
for (Map<Object, Object> map : rangeLists) {
if (map != null && (!map.isEmpty())) {
qb = QueryBuilders.rangeQuery(StringUtil.trim(map.get("field"))).from(StringUtil.trim(map.get("from"))).to(StringUtil.trim(map.get("to")));
}
}
}
//构造排序参数
SortBuilder sortBuilder = null;
if (sortMaps != null) {
for (Object key : sortMaps.keySet()) {
sortBuilder = SortBuilders.fieldSort((String) key).order(StringUtil.trim(sortMaps.get(key)).equals("ASC") ? SortOrder.ASC : SortOrder.DESC);
}
}
//构造查询
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index).setTypes(type).setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(bb1) // Query
.setPostFilter(qb) // Filter
.setFrom(from).setSize(size).addSort(sortBuilder).setExplain(true);
//构造高亮字段
if (fields != null && fields.size() > 0) {
for (String field : fields) {
searchRequestBuilder.addHighlightedField(field);
}
searchRequestBuilder.setHighlighterEncoder("UTF-8").setHighlighterPreTags("<span style=\"color:red\">").setHighlighterPostTags("</span>");
}
//查询
SearchResponse response = searchRequestBuilder.execute().actionGet();
//取值
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
Map<String, HighlightField> result = hit.highlightFields();
//用高亮字段替换搜索字段
for (String field : fields) {
HighlightField titleField = result.get(field);
if (titleField == null) {
continue;
}
Text[] titleTexts = titleField.fragments();
String value = "";
for (Text text : titleTexts) {
value += text;
}
hit.getSource().put(field, value);
}
lists.add(hit.getSource());
//System.out.println(hit.getSource());
//System.out.println(hit.getHighlightFields());
//System.out.println(hit.getSourceAsString());//json格式
}
return lists;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
测试的类
package elasticsearch_web;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.apache.commons.lang.time.DateFormatUtils;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
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.UpdateRequest;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.highlight.HighlightField;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.utils.StringUtil;
import net.sf.json.JSONObject;
import utils.ElasticsearchTools;
/**
* 测试类
*/
public class ElasticsearchTest {
public static void main(String args[]) throws UnknownHostException {
//updateDocument("member", "user", "1", "message", "我真的爱过啊!");
//getDocuments("member", "user", "1", "2");
//批量新增方法
List<Map<Object, Object>> list = new ArrayList<Map<Object, Object>>();
Map<Object, Object> map = new HashMap<Object, Object>();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String pattern = "yyyy-MM-dd'T'HH:mm:ss:SSSZZ";
System.out.println(DateFormatUtils.format(new Date(), pattern));
map.put("id", "1");
map.put("desc", "我们是共产主义接班人");
map.put("name", "小名");
map.put("type", "1");
map.put("age", "36");
map.put("mydate", df.format(new Date()));
map.put("birthday", DateFormatUtils.format(new Date(), pattern));
map.put("love", "足球,自行车,吉他");
Map<Object, Object> map1 = new HashMap<Object, Object>();
map1.put("id", "2");
map1.put("desc", "我们是资本主义的接班人");
map1.put("name", "小芳");
map1.put("type", "12");
map1.put("age", "32");
map1.put("birthday", df.format(new Date()));
map1.put("love", "足球,滑板,汽车");
Map<Object, Object> map2 = new HashMap<Object, Object>();
map2.put("id", "3");
map2.put("name", "大豆");
map2.put("type", "123");
map2.put("desc", "我哎打球");
map2.put("age", "31");
map2.put("birthday", df.format(new Date()));
map2.put("love", "航模,秋千,汽车");
Map<Object, Object> map3 = new HashMap<Object, Object>();
map3.put("id", "4");
map3.put("name", "阿信");
map3.put("type", "2");
map3.put("desc", "我喜欢打篮球");
map3.put("age", "21");
map3.put("birthday", DateFormatUtils.format(new Date(), pattern));
map3.put("love", "摩托,拼图,汽车");
Map<Object, Object> map4 = new HashMap<Object, Object>();
map4.put("id", "5");
map4.put("name", "阿信");
map4.put("type", "2");
map4.put("desc", "我喜欢打篮球");
map4.put("age", "21");
map4.put("birthday", DateFormatUtils.format(new Date(), pattern));
map4.put("love", "摩托,拼图,汽车");
Map<Object, Object> map5 = new HashMap<Object, Object>();
map5.put("id", "6");
map5.put("name", "阿信");
map5.put("type", "2");
map5.put("desc", "我喜欢打篮球");
map5.put("age", "21");
map5.put("birthday", DateFormatUtils.format(new Date(), pattern));
map5.put("love", "摩托,拼图,汽车");
list.add(map);
list.add(map3);
/*list.add(map1);
list.add(map2);
list.add(map4);
list.add(map5);*/
ElasticsearchTools.addDocuments(list, "lol", "lol");
//测试查询方法
/* Map<Object, Object> queryMaps = new HashMap<>();
queryMaps.put("type", "1");
Map<Object, Object> fullTextQueryMaps = new HashMap<>();
fullTextQueryMaps.put("name", "小");
List<Map<Object, Object>> rangeLists = new ArrayList<Map<Object, Object>>();
Map<Object, Object> rangeMaps = new HashMap<>();
rangeMaps.put("field", "age");
rangeMaps.put("from", "10");
rangeMaps.put("to", "35");
Map<Object, Object> rangeMaps1 = new HashMap<>();
rangeMaps.put("field", "age");
rangeMaps.put("from", "36");
rangeMaps.put("to", "39");
rangeLists.add(rangeMaps1);
Map<Object, Object> sortMaps = new HashMap<>();
sortMaps.put("age", "ASC");
List<String> fields = new ArrayList<String>();
fields.add("name");
fields.add("desc");
List<Map<String, Object>> lists = ElasticsearchTools.queryDocuments("member", "test", 0, 10, rangeLists, queryMaps, sortMaps, fields, fullTextQueryMaps);
*/
}
}
最后给个API链接,以及几个参考站。
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/transport-client.html
http://eggtwo.com/news/detail/147
http://es.xiaoleilu.com/010_Intro/25_Tutorial_Indexing.html