zoukankan      html  css  js  c++  java
  • Elasticsearch09-Java API

    Java High Level REST Client

    增删改查

        @Test
        @SneakyThrows
        void esCRUD() {
            Settings settings = Settings.builder()
                    .put("cluster.name", "elasticsearch").build();
            TransportClient client = new PreBuiltTransportClient(settings)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))//通讯端口  而不是服务端口
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9301));
            //导入数据
            create(client);
            get(client);
            getAll(client);
            update(client);
            delete(client);
            client.close();
        }
        
    
        private void create(TransportClient client) {
            List<Product> list = service.list();
            for (Product item : list) {
                System.out.println(item.getCreateTime().toLocalDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                IndexResponse response = client.prepareIndex("product2", "_doc", item.getId().toString())
                        .setSource(XContentFactory.jsonBuilder()
                                .startObject()
                                .field("name", item.getName())
                                .field("desc", item.getDesc())
                                .field("price", item.getPrice())
                                .field("date", item.getCreateTime().toLocalDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
                                .field("tags", item.getTags().split(","))
                                .endObject())
                        .get();
                System.out.println(response.getResult());
            }
        }
        
        private void get(TransportClient client) {
            GetResponse response = client.prepareGet("product2", "_doc", "1").get();
            String index = response.getIndex();//获取索引名称
            String type = response.getType();//获取索引类型
            String id = response.getId();//获取索引id
            System.out.println("index:" + index);
            System.out.println("type:" + type);
            System.out.println("id:" + id);
            System.out.println(response.getSourceAsString());
        }
        
        
    
        private void getAll(TransportClient client) {
            SearchResponse response = client.prepareSearch("product2")
                    .get();
            SearchHits searchHits = response.getHits();
            SearchHit[] hits = searchHits.getHits();
            for (SearchHit hit : hits) {
                String res = hit.getSourceAsString();
                System.out.println("res" + res);
            }
        }
        
        private void update(TransportClient client) {
            UpdateResponse response = client.prepareUpdate("product2", "_doc", "2")
                    .setDoc(XContentFactory.jsonBuilder()
                            .startObject()
                            .field("name", "update name")
                            .endObject())
                    .get();
            System.out.println(response.getResult());
        }
        
        
        private void delete(TransportClient client) {
            DeleteResponse response = client.prepareDelete("product2", "_doc", "2").get();
            System.out.println(response.getResult());
        }

    组合查询

        @Test
        @SneakyThrows
        void multiSearch() {
            TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9301));
    
            SearchResponse response = client.prepareSearch("product2")
                    .setQuery(QueryBuilders.termQuery("name.keyword", "板凳"))                 // Query
                    .setPostFilter(QueryBuilders.rangeQuery("price").from(0).to(4000))
                    .setFrom(0).setSize(3)
                    .get();
            SearchHits searchHits = response.getHits();
            SearchHit[] hits = searchHits.getHits();
            for (SearchHit hit : hits) {
                String res = hit.getSourceAsString();
                System.out.println("res" + res);
            }
            client.close();
        }
    
    #相当于
    GET /product2/_search
    {
      "query": {
          "term": {
            "name.keyword": {
              "value": "板凳"
            }
          }
      },
      "post_filter": {
        "range": {
          "price": {
            "gte": 0,
            "lte": 4000
          }
        }
      }, 
      "from": 0,
      "size": 2
    }

    聚合查询

    @Test
        @SneakyThrows
        void aggSearch() {
            TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9301));
    
            //region 2->计算并返回聚合分析response对象
            SearchResponse response = client.prepareSearch("product2")
                    .addAggregation(
                            AggregationBuilders.dateHistogram("group_by_month")
                                    .field("date")
                                    .calendarInterval(DateHistogramInterval.MONTH)
    //                                .dateHistogramInterval(DateHistogramInterval.MONTH)
                                    .subAggregation(
                                            AggregationBuilders
                                                    .terms("by_tag")
                                                    .field("tags.keyword")
                                                    .subAggregation(
                                                            AggregationBuilders
                                                                    .avg("avg_price")
                                                                    .field("price")
                                                    )
                                    )
                    ).setSize(0)
                    .execute().actionGet();
    
    
            Map<String, Aggregation> map = response.getAggregations().asMap();
            Aggregation group_by_month = map.get("group_by_month");
            Histogram dates = (Histogram) group_by_month;
            Iterator<Histogram.Bucket> buckets = (Iterator<Histogram.Bucket>) dates.getBuckets().iterator();
    
            while (buckets.hasNext()) {
                Histogram.Bucket dateBucket = buckets.next();
                System.out.println("
    
    月份:" + dateBucket.getKeyAsString() + "
    计数:" + dateBucket.getDocCount());
                Aggregation group_by_tag = dateBucket.getAggregations().asMap().get("by_tag");
                StringTerms terms = (StringTerms) group_by_tag;
                Iterator<StringTerms.Bucket> tagsBucket = terms.getBuckets().iterator();
                while (tagsBucket.hasNext()) {
                    StringTerms.Bucket tagBucket = tagsBucket.next();
                    System.out.println("	标签名称:" + tagBucket.getKey() + "
    	数量:" + tagBucket.getDocCount());
                    Aggregation avg_price = tagBucket.getAggregations().get("avg_price");
                    Avg avg = (Avg) avg_price;
                    System.out.println("	平均价格:" + avg.getValue() + "
    ");
                }
            }
            client.close();
        }
        
    相当于
    GET /product2/_search
    {
      "aggs": {
        "group_by_month": {
          "date_histogram": {
            "field": "date",
            "interval": "month"
          },"aggs": {
            "by_tag": {
              "terms": {
                "field": "tags.keyword"
              },"aggs": {
                "avg_price": {
                  "avg": {
                    "field": "price"
                  }
                }
              }
            }
          }
        }
      },
      "size": 0
    }

    Java Low Level REST Client

    创建索引

        public void createIndex() {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("localhost", 9200, "http"),
                            new HttpHost("localhost", 9201, "http")));
    
            org.elasticsearch.client.indices.CreateIndexRequest request = new org.elasticsearch.client.indices.CreateIndexRequest("test_index");
    
            request.settings(Settings.builder()
                    .put("index.number_of_shards", 3)
                    .put("index.number_of_replicas", 2)
            );
            CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
            if (createIndexResponse.isAcknowledged()) {
                System.out.println("创建index成功!");
            } else {
                System.out.println("创建index失败!");
            }
            client.close();
        }

    获取索引

        public void getIndex() {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("localhost", 9200, "http"),
                            new HttpHost("localhost", 9201, "http")));
    
            GetIndexRequest request = new GetIndexRequest("test_index*");
            GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
            String[] indices = response.getIndices();
            for (String indexName : indices) {
                System.out.println("index name:" + indexName);
            }
            client.close();
        }

    删除索引

        public void delIndex() {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("localhost", 9200, "http"),
                            new HttpHost("localhost", 9201, "http")));
            DeleteIndexRequest request = new DeleteIndexRequest("test_index");
            AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
            if (response.isAcknowledged()) {
                System.out.println("删除index成功!");
            } else {
                System.out.println("删除index失败!");
            }
            client.close();
        }

    插入数据

        public void insertData() {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("localhost", 9200, "http"),
                            new HttpHost("localhost", 9201, "http")));
            // 数据源
            List<Product> list = service.list();
    
            //插入数据,index不存在则自动根据匹配到的template创建。index没必要每天创建一个,如果是为了灵活管理,最低建议每月一个 yyyyMM。
            IndexRequest request = new IndexRequest("test_index");
            //最好不要自定义id 会影响插入速度。
            Product product = list.get(0);
            Gson gson = new Gson();
            request.id(product.getId().toString());
            request.source(gson.toJson(product)
                    , XContentType.JSON);
            IndexResponse response = client.index(request, RequestOptions.DEFAULT);
            System.out.println(response);
            client.close();
        }

    BULK批量插入数据

        public void batchInsertData() {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("localhost", 9200, "http"),
                            new HttpHost("localhost", 9201, "http")));
            BulkRequest request = new BulkRequest("test_index");
            Gson gson = new Gson();
            Product product = new Product();
            product.setPrice(3999.00);
            product.setDesc("xioami");
            for (int i = 0; i < 10; i++) {
                product.setName("name" + i);
                request.add(new IndexRequest().source(gson.toJson(product)
                        , XContentType.JSON));
            }
            BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
            System.out.println("数量:" + response.getItems().length);
            client.close();
        }
    说明: _id自动生成

    根据文档id查询

        public void getById() {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("localhost", 9200, "http"),
                            new HttpHost("localhost", 9201, "http")));
            //注意 这里查询使用的是别名。
            GetRequest request = new GetRequest("test_index", "z_Mp1HsBNznNaQlP5ZvX");
            String[] includes = {"name", "price"};
            String[] excludes = {"desc"};
            FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
            //只查询特定字段。如果需要查询所有字段则不设置该项。
            request.fetchSourceContext(fetchSourceContext);
            GetResponse response = client.get(request, RequestOptions.DEFAULT);
            System.out.println(response);
            client.close();
        }

    根据文档id删除

        public void delById() throws IOException {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("localhost", 9200, "http"),
                            new HttpHost("localhost", 9201, "http")));
            DeleteRequest request = new DeleteRequest("test_index", "1");
            DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
            System.out.println(response);
            client.close();
        }

    多条件查询_mget

        public void multiGetById() throws IOException {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("localhost", 9200, "http"),
                            new HttpHost("localhost", 9201, "http")));
            //多个根据id查询
            MultiGetRequest request = new MultiGetRequest();
            request.add("test_index", "y_Mp1HsBNznNaQlP5ZvX");
            //两种写法
            request.add(new MultiGetRequest.Item(
                    "test_index",
                    "zfMp1HsBNznNaQlP5ZvX"));
            MultiGetResponse response = client.mget(request, RequestOptions.DEFAULT);
            for (MultiGetItemResponse itemResponse : response) {
                System.out.println(itemResponse.getResponse().getSourceAsString());
            }
            client.close();
        }

    根据查询条件进行更新

        public void updateByQuery() throws IOException {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("localhost", 9200, "http"),
                            new HttpHost("localhost", 9201, "http")));
            UpdateByQueryRequest request = new UpdateByQueryRequest("test_index");
            //默认情况下,版本冲突会中止 UpdateByQueryRequest 进程,但是你可以用以下命令来代替
            //设置版本冲突继续
    //        request.setConflicts("proceed");
            // 根据该条件进行更新
            request.setQuery(QueryBuilders.matchQuery("name", "name1 name3"));
    //        //限制更新条数
    //        request.setMaxDocs(10);
            // 设置更新内容
            request.setScript(
                    new Script(ScriptType.INLINE, "painless", "ctx._source.desc+='#';", Collections.emptyMap()));
            BulkByScrollResponse response = client.updateByQuery(request, RequestOptions.DEFAULT);
            System.out.println(response);
            client.close();
        }
  • 相关阅读:
    C语言ASM汇编内嵌语法
    Linux下安装安装arm-linux-gcc
    苹果手机(ios系统)蓝牙BLE的一些特点
    蓝牙BLE数据包格式汇总
    蓝牙BLE4.0的LL层数据和L2CAP层数据的区分与理解
    nrf52840蓝牙BLE5.0空中数据解析
    nrf52840蓝牙BLE5.0空中速率测试(nordic对nordic)
    nrf52832协议栈S132特性记录
    使用 Open Live Writer 创建我的第一个博文
    Codeforces Round #691 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/15256791.html
Copyright © 2011-2022 走看看