欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java对elastic search简单操作详解

程序员文章站 2022-07-05 07:58:04
...

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/