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