码迷,mamicode.com
首页 > 编程语言 > 详细

elasticsearch java 代码参考

时间:2016-05-11 01:30:40      阅读:696      评论:0      收藏:0      [点我收藏+]

标签:

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

elasticsearch java 代码参考

标签:

原文地址:http://www.cnblogs.com/bmaker/p/5480014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!