Java操作elasticsearch
来源:互联网 发布:淘宝客服每日工作汇报 编辑:程序博客网 时间:2024/05/22 15:43
转载请注明出处,谢谢
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
2 0
- java对elasticsearch操作
- Java操作elasticsearch
- Java操作Elasticsearch
- Java 操作 ElasticSearch
- java 操作 elasticsearch 杂记
- Java操作Elasticsearch
- Elasticsearch Java-API CRUD Java操作Elasticsearch
- 使用Elasticsearch的java api,操作elasticsearch
- 使用java客户端操作elasticsearch
- java操作ElasticSearch的API
- elasticsearch JAVA客户端操作---索引的CURD
- ElasticSearch的java API基本操作
- Elasticsearch 2.3.2 java客户端操作
- Elasticsearch笔记五之java操作es
- Elasticsearch简单操作(Java代码)
- Elasticsearch 2.3.2 java客户端操作
- ElasticSearch 5.0.1 java API操作
- 使用Java Rest Client操作Elasticsearch
- LSTM初探
- Qtcreator 修改工程名字的方法
- 数据库设计Step by Step (7)——概念数据建模
- 框架搭建的相关代码
- Aizu 2170 Marked Ancestor【并查集】
- Java操作elasticsearch
- spark中的task 分割
- ubuntu下配置java环境
- 关于定位的一些疑问
- 第六周【项目4-静态时间类】
- hdu 1540 Tunnel Warfare 【线段树 区间合并】
- kafka源码解析Word版
- Android开源项目分包方式学习(eoe、oschina、github)
- poj 3069 Saruman's army