zoukankan      html  css  js  c++  java
  • elasticsearch(一):JAVA api操作

    1.创建一个mavan项目,项目的以来配置如下。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.es</groupId>
        <artifactId>es-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    
    
        <dependencies>
    
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>transport</artifactId>
                <version>6.3.2</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
    
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.21</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.8.2</version>
            </dependency>
    
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.0</version>
            </dependency>
        </dependencies>
    </project>

    2.建立连接elasticsearch的工具类。

    
    
    package com.util;


    import org.elasticsearch.client.Client;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Setting;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.TransportAddress;
    import org.elasticsearch.transport.client.PreBuiltTransportClient;

    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    import java.net.UnknownHostException;

    public class ESUtils {
    public static final String INDEX_NAME="userindex";

    public static String getIndexName(){
    return INDEX_NAME;
    }
    public static final String TYPE_NAME="tweet";

    public static String getTypeName(){
    return TYPE_NAME;
    }

    public static Client getClient(){
    Settings settings = Settings.builder()
    //指定集群名称
    .put("cluster.name","my-application")
    //探测集群中机器状态
    .put("client.transport.sniff",true).build();

    //创建客户端
    Client client = null;
    try {
    client = new PreBuiltTransportClient(settings).addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9300));
    } catch (UnknownHostException e) {
    e.printStackTrace();
    }
    return client;
    }


    public static void closeClient(Client client){
    if(null != client){
    client.close();
    }
    }
    }
     

    3.创建索引

     /**
         * 创建索引
         * 如果创建的索引名称已经存在,创建会抛出异常,因此先查询要创建的索引是否已存在,不存在在创建
         */
        @Test
        public void testCreate(){
            //待创建的索引名称
            String indexName = "userindex";
            //获取连接
            Client client = ESUtils.getClient();
            //判断索引是否存在
            IndicesExistsRequest existsRequest = new IndicesExistsRequest(indexName);
            IndicesExistsResponse existsResponse = client.admin().indices().exists(existsRequest).actionGet();
            if(!existsResponse.isExists()){
                //创建索引
                CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
                CreateIndexResponse createIndexResponse = client.admin().indices().create(createIndexRequest).actionGet();
                //判断创建是否成功
                if (createIndexResponse.isAcknowledged()){
                    logger.info("创建成功");
                }else{
                    logger.info("创建失败");
                }
            }else {
                logger.info("索引已存在,无法创建");
            }
            //关闭连接
            ESUtils.closeClient(client);
        }

    4.向索引添加数据

    /**
         * 向索引中逐条加入数据
         */
        @Test
        public void add(){
            //获取连接
            Client client = ESUtils.getClient();
            //待添加的json数据
            String strJson ="{"age":25,"name":"张三","weight":76,"married":true}";
            XContentParser parser = null;
            try {
                //数据解析,因为不支持json和对象类型的数据,要将其转为map
                 parser = XContentFactory.xContent(XContentType.JSON).createParser(NamedXContentRegistry.EMPTY,DeprecationHandler.THROW_UNSUPPORTED_OPERATION,strJson);
                 //插入数据
                IndexResponse indexResponse = client.prepareIndex().setIndex(ESUtils.getIndexName())
                        .setType(ESUtils.getTypeName())
                        .setSource(parser.map())
                        //设置数据的id,id唯一,如果id已存在则是修改
                        .setId("2")
                        .execute()
                        .actionGet();
                
                logger.info("添加成功,"+indexResponse.status());
        }
    catch (IOException e) {
            e.printStackTrace();
        }
    finally {
          ESUtils.closeClient(client);
      }
    }

    5.修改数据

      /**
         * 更新数据
         */
        @Test
        public void update(){
            Client client = ESUtils.getClient();
            Map<String,Object> map = new HashMap<String, Object>();
            map.put("age",56);
            map.put("name","李四");
            map.put("weight",69);
            map.put("married",false);
            UpdateResponse updateResponse = client.prepareUpdate()
                    .setIndex(ESUtils.getIndexName())
                    .setType(ESUtils.getTypeName())
                    .setDoc(map)
                    //要更新的数据的id
                    .setId("2").execute().actionGet();
    
            logger.info("更新成功,"+updateResponse.status());
            ESUtils.closeClient(client);
        }

    6.删除数据

    /**
         * 根据id删除数据
         */
        @Test
        public void delete(){
            //获取连接
            Client client = ESUtils.getClient();
            //删除数据
            DeleteResponse deleteResponse = client.prepareDelete()
                    .setIndex(ESUtils.getIndexName())
                    .setType(ESUtils.getTypeName())
                    //设置id
                    .setId("1")
                    .execute().actionGet();
    
            logger.info("删除成功,"+deleteResponse.status());
            //关闭连接
            ESUtils.closeClient(client);
        }

    7.根据id查询数据

    /**
         * 根据id查询数据
         */
        @Test
        public void select(){
            //获取连接
            Client client = ESUtils.getClient();
            //查询数据
            GetResponse getResponse = client.prepareGet()
                    .setIndex(ESUtils.getIndexName())
                    .setType(ESUtils.getTypeName())
                    .setId("1")
                    .execute().actionGet();
            //数据
            logger.info("data:="+getResponse.getSourceAsString());
            //关闭连接
            ESUtils.closeClient(client);
        }

    8.全文查询

     /**
         * 全文检索数据
         */
        @Test
        public void search(){
            //获取连接
            Client client = ESUtils.getClient();
            //设置查询条件
            QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("ipad");
            //查询
            SearchResponse response = client.prepareSearch(ESUtils.getIndexName())
                    .setQuery(queryBuilder)
                    //设置分页
                    .setFrom(0).setSize(60)
                    .execute().actionGet();
            //获取查询结果
            SearchHits shs = response.getHits();
            logger.info("查询数据条数:"+shs.getTotalHits());
            for (SearchHit hit:shs.getHits()) {
                logger.info(hit.getSourceAsString());
            }
            //关闭连接
            ESUtils.closeClient(client);
        }

    9.批量插入数据

       //批量插入数据
        @Test
        public void testBulk(){
            //获取连接
            Client client = ESUtils.getClient();
            //批量接口
            BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
            User user = new User();
            //设置对象的属性
            for (int i=3;i<40002;i++){
                user.setName("user_"+UUID.randomUUID().toString().replace("-","").substring(0,6));
                SecureRandom random = new SecureRandom();
                long l = Math.abs(random.nextLong());
                user.setWeight(l);
                user.setMarried(l%3==0?true:false);
                user.setAge(l%2==0?28:82);
                //将对象转为json字符串
                Gson gson = new Gson();
                String json = gson.toJson(user);
                XContentParser parser = null;
                //数据转换
                try {
                    parser = XContentFactory.xContent(XContentType.JSON).createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, json);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                IndexRequestBuilder ir = null;
                //预插入数据
                try {
                    ir = client.prepareIndex("userindex","tweet",String.valueOf(i)).setSource(parser.map());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                bulkRequestBuilder.add(ir);
            }
           //批量插入
            BulkResponse bulkResponse  = bulkRequestBuilder.execute().actionGet();
    
            //判断插入是否失败
            if(bulkResponse.hasFailures()){
                //失败原因
                logger.info(bulkResponse.buildFailureMessage());
                logger.info("失败");
            }
        }

    10.按指定条件查询

       /**
         * 按指定属性查询
         */
        @Test
        public void testSearchByFiled(){
            //获取连接
            Client client = ESUtils.getClient();
            //查询过滤器
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            //查询条件  查询字段名称  和 值
            boolQueryBuilder.must(QueryBuilders.termQuery("age",28));
            boolQueryBuilder.must(QueryBuilders.termQuery("married",true));
            //知道要查询的索引和type
            SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ESUtils.getIndexName()).setTypes(ESUtils.getTypeName());
            //设置查询的分页
            searchRequestBuilder.setQuery(boolQueryBuilder).setFrom(0).setSize(10000);
            //执行查询
            SearchResponse response = searchRequestBuilder.execute().actionGet();
            //查询结果数
            logger.info("数据总数:"+response.getHits().totalHits);
            //变量查询结果集
            for (SearchHit hit:response.getHits()) {
                logger.info(hit.getSourceAsString());
            }
            //关闭连接
            ESUtils.closeClient(client);
        }

    11.聚合数据

      /**
         * 按指定条件聚合数据(分类统计)
         */
        @Test
        public void testFacets(){
            //获取连接
            Client client = ESUtils.getClient();
            //设置待查询的索引和类型
            SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ESUtils
            .getIndexName()).setTypes(ESUtils.getTypeName());
            //设置查询条件
            TermsAggregationBuilder builder = AggregationBuilders
                    //查询结果集名称
                    .terms("marry")
                    //要查询的属性名称
                    .field("age");
            searchRequestBuilder.addAggregation(builder);
            //执行查询
            SearchResponse response = searchRequestBuilder.execute().actionGet();
            //根据设置的名字获取查询结果
            Terms terms = response.getAggregations().get("marry");
            List<? extends Terms.Bucket> buckets = terms.getBuckets();
            Map<String,String> map = new HashMap<String, String>();
            //聚合统计数量
            for (Terms.Bucket bucket :buckets){
                String key = bucket.getKeyAsString();
                map.put(key,bucket.getDocCount()+"");
            }
            //输出查询数量
            for (Map.Entry<String,String> entry : map.entrySet()){
                logger.info(entry.getKey()+":"+entry.getValue());
            }
            //关闭连接
            ESUtils.closeClient(client);
        }

    12.删除索引

    /**
         * 删除索引
         */
        @Test
        public void testDelete(){
            //获取连接
            Client client = ESUtils.getClient();
            //判断索引是否存在
            IndicesExistsRequest existsRequest = new IndicesExistsRequest(ESUtils.getIndexName());
            IndicesExistsResponse existsResponse = client.admin().indices().exists(existsRequest).actionGet();
            if(existsResponse.isExists()){
                //删除
                DeleteIndexResponse deleteIndexResponse = client.admin().indices().prepareDelete(ESUtils.getIndexName()).execute().actionGet();
                if(deleteIndexResponse.isAcknowledged()){
                    logger.info("删除成功");
                }else{
                    logger.info("删除失败");
                }
            }else {
                logger.info("索引 "+ESUtils.getIndexName()+" 不存在");
            }
            //关闭连接
            ESUtils.closeClient(client);
        }
  • 相关阅读:
    数据模型Model(I)
    泛型
    iOS开发之widget实现
    ios断点续传:NSURLSession和NSURLSessionDataTask实现
    iOS 直播类APP开发流程解析
    iOS实现电话状态监听 CoreTelephony
    iOS9全新的联系人相关框架——Contacts Framework
    iOS开发集成微信支付
    如何在 Git 里撤销(几乎)任何操作
    iOS开发网络缓存原理
  • 原文地址:https://www.cnblogs.com/jack1995/p/9372292.html
Copyright © 2011-2022 走看看