Java对elastic search简单操作详解

elasticsearch是一款高效的数据存储与查询工具,最近自己在学着用java对es进行操作,在这里记录分享一下。

1 建立连接:
主要用到 集群名,IP地址,端口号(es默认一般为9300)。我这里在构造函数中进行建立连接,使用单例进行调用

    private static final ElasticsearchUtils ELASTICSEARCH_UTILS  = new ElasticsearchUtils();
    private static TransportClient client;//实例化一个客户端
    private String clusterName = "jiesi-1";
    private String ipAddress = "192.168.200.193";
    private int port = 9303;
    public static long total = 0; //条件命中总数

    private ElasticsearchUtils() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("cluster.name", clusterName);
        Settings.Builder settings = Settings.builder().put(map);
        try {
            client = TransportClient.builder().settings(settings).build()
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ipAddress), port));
            logger.info("建立连接成功");
        } catch (Exception e) {
            logger.info("error--->建立连接失败");
        }
    }

    public static ElasticsearchUtils newInstance(){
        return ELASTICSEARCH_UTILS;
    }

这里建立连接便成功了,接下来是执行简单的查询

2 查询
分两个部分,一个是查询的执行,另个是查询条件的构建,由于es有自己一套独特的查询条件构建方式,建议大家去看一下es的官方api看看具体的查询条件的规则,这里只提供简单的must查询以及复合查询

查询执行方法:传过来的map参数,是一些条件的集合

/**
     * 执行查询
     * 
     * @param indexname
     * @param map
     * @return
     */
    public List<Map<String, String>> MultiSearch(String indexname, Map<String, String> map) {
        // 按输入条件查询
        int showNum = Integer.parseInt(map.get("showNum"));
        QueryBuilder queryBuilder = EsQueryBuilder.newInstance().matchQuery(map);//获取查询条件
        SearchResponse actionGet =     client.prepareSearch(indexname).setQuery(queryBuilder).setFrom(0).setSize(showNum)
                .execute().actionGet();//执行查询
        SearchHits hits = actionGet.getHits();//接收结果
        total = hits.totalHits();//查询出你的条件命中的结果总数

        List<Map<String, String>> result = new LinkedList<>();
        EsResultFields esResultFields = new EsResultFields();
        result = esResultFields.dealer(hits);//处理结果,我这里用到了一个结果处理器,即对返回的结果进行处理
        return result;
    }

查询条件的构建:

/**
 * 查询构造器类
 * 
 * @author chenze3
 *
 */
public class EsQueryBuilder {

    public static final EsQueryBuilder queryBuilder = new EsQueryBuilder();

    public static EsQueryBuilder newInstance() {
        return queryBuilder;
    }
    /**
     * 布尔型查找
     * 
     * @param map
     * @return
     */
    protected QueryBuilder matchQuery(Map<String, String> map) {
        //匹配查询
        QueryBuilder queryBuilder1 = QueryBuilders.termQuery("pin",map.get("pin"));// 搜索pin字段
        QueryBuilder queryBuilder2 = QueryBuilders.termQuery("client",map.get("client"));// 搜索client字段
        QueryBuilder queryBuilder3 = QueryBuilders.termQuery("functionId",map.get("functionId"));// 搜索functionID字段
        QueryBuilder queryBuilder4 = QueryBuilders.rangeQuery("time").gte(map.get("start")).lte(map.get("end"));// 搜索time范围
        // 将以上条件添加到bool查询
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        if(!map.get("pin").equals("")){//做空判断,传入数据为空就不将此条件加入查询
            queryBuilder.must(queryBuilder1);
        }
        if(!map.get("client").equals("")){
            queryBuilder.must(queryBuilder2);
        }
        if(!map.get("functionId").equals("")){
            queryBuilder.must(queryBuilder3);
        }
        if(!map.get("start").equals("")&&!map.get("start").equals("")){
            queryBuilder.must(queryBuilder4);
        }

        return queryBuilder;//返回条件对象
    }

}

这样就可以对es进行简单的查询,大家也可以对各种查询条件进行封装,以满足各种查询场景,es还提供分页查询

SearchResponse actionGet = client.prepareSearch(indexname).setQuery(queryBuilder).setFrom(0).setSize(showNum).execute().actionGet();//执行查询

setFrom(0)为偏移量 ,一般设为0
setSize(showNum)为查询返回的结果数量


最后贴上两个网址
es 官方api:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/index.html
es全面详解(有兴趣深入的可以看看):https://es.xiaoleilu.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值