ElasticSearch--客户端使用

pom.xml

<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>

Bean的配置

@Bean
    public TransportClient client(){
        InetSocketAddress socketAddress = new InetSocketAddress("192.168.209.101",9300);
        InetSocketTransportAddress node=new InetSocketTransportAddress(socketAddress);

        Settings settings=Settings.builder()
                .put("cluster.name","elasticsearch")
                .build();

        TransportClient client=new PreBuiltTransportClient(settings);
        client.addTransportAddress(node);
        return client;
    }

基础CRUD
添加

try {
            XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject();
            xContentBuilder.field("title","123");
            xContentBuilder.field("author","张三");
            xContentBuilder.field("word_count",1);
            xContentBuilder.field("publish_date",new Date().getTime());
            xContentBuilder.endObject();
            IndexResponse indexResponse = this.transportClient.prepareIndex("book", "novel").setSource(xContentBuilder).get();
            return new ResponseEntity(indexResponse.getId(),HttpStatus.OK);
        } catch (IOException e) {
            e.printStackTrace();
        }

删除

DeleteRequestBuilder deleteRequestBuilder = this.transportClient.prepareDelete("book", "novel", "AWcYBYPagjnrvyjKpdyD");
        DeleteResponse deleteResponse = deleteRequestBuilder.get();
        return new ResponseEntity(deleteResponse.getResult().toString(),HttpStatus.OK);

修改

UpdateRequest updateRequest=new UpdateRequest("book", "novel","AWcYAb1NgjnrvyjKpdyB");
        try {
            XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject();
            xContentBuilder.field("publish_date","2018-11-16 11:11:11");
            xContentBuilder.endObject();
            updateRequest.doc(xContentBuilder);

            UpdateResponse updateResponse = this.transportClient.update(updateRequest).get();
            return new ResponseEntity(updateResponse,HttpStatus.OK);
        } catch (Exception e) {
            e.printStackTrace();
        }

查询

//布尔查询
        BoolQueryBuilder booleanQueryBuilder= QueryBuilders.boolQuery();
        booleanQueryBuilder.must(QueryBuilders.matchQuery("author","李四"));

        RangeQueryBuilder rangeQueryBuilder=QueryBuilders.rangeQuery("word_count").from(2000);
        rangeQueryBuilder.to(3000);
        booleanQueryBuilder.filter(rangeQueryBuilder);

        SearchRequestBuilder searchRequestBuilder = this.transportClient.prepareSearch("book").setTypes("novel");
        searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
        searchRequestBuilder.setQuery(booleanQueryBuilder);
        searchRequestBuilder.setFrom(0);
        searchRequestBuilder.setSize(10);
        logger.info(searchRequestBuilder.toString());

        SearchResponse searchResponse = searchRequestBuilder.get();
        List<Map<String,Object>> result=new ArrayList<>();
        for(SearchHit hit:searchResponse.getHits()){
            result.add(hit.getSource());
        }

根据id查询

GetResponse result = this.transportClient.prepareGet("book", "novel", id + "").get();
        return new ResponseEntity(result.getSource(), HttpStatus.OK);

聚合查询,根据两个字段进行分组,然后算分组后的平均值

SearchResponse response = client.prepareSearch("company")
                .addAggregation(AggregationBuilders.terms("group_by_country").field("country")
                        .subAggregation(AggregationBuilders.dateHistogram("group_by_join_date").field("join_date")
                                .dateHistogramInterval(DateHistogramInterval.YEAR)
                                .subAggregation(AggregationBuilders.avg("avg_salary").field("salary"))))
                .execute().actionGet();
        Map<String, Aggregation> aggrMap = response.getAggregations().asMap();
        StringTerms groupByCountryTerm=(StringTerms)aggrMap.get("group_by_country");
        Iterator<StringTerms.Bucket> groupByCountryTermIter = groupByCountryTerm.getBuckets().iterator();
        while(groupByCountryTermIter.hasNext()){
            StringTerms.Bucket groupCountryBucket = groupByCountryTermIter.next();
            System.out.println(groupCountryBucket.getKey()+":"+groupCountryBucket.getDocCount());
            Histogram groupByJoinDate = (Histogram) groupCountryBucket.getAggregations().asMap().get("group_by_join_date");
            Iterator<? extends Histogram.Bucket> groupByJoinDateBucketIter = groupByJoinDate.getBuckets().iterator();
            while(groupByJoinDateBucketIter.hasNext()){
                Histogram.Bucket groupByJoinDateBucket = groupByJoinDateBucketIter.next();
                System.out.println(groupByJoinDateBucket.getKey()+":"+groupByJoinDateBucket.getDocCount());
            }
        }

对应的json

GET company/employee/_search
{
  "size": 0,
  "aggs": {
    "group_by_country": {
      "terms": {
        "field": "country"
      },
      "aggs": {
        "group_by_join_date": {
          "date_histogram": {
            "field": "join_date",
            "interval": "year"
          },
          "aggs":{
            "avg_salary":{
              "avg":{
                "field": "salary"
              }
            }
          }
        }
      }
    }
  }
}

upsert
mapping

PUT /car_shop
{
    "mappings": {
        "cars": {
            "properties": {
                "brand": {
                    "type": "text",
                    "fields": {
                        "raw": {
                            "type": "keyword"
                        }
                    }
                },
                "name": {
                    "type": "text",
                    "fields": {
                        "raw": {
                            "type": "keyword"
                        }
                    }
                }
            }
        }
    }
}

测试代码

IndexRequest indexRequest = new IndexRequest("car_shop", "cars", "1")
                .source(XContentFactory.jsonBuilder()
                        .startObject()
                        .field("brand", "宝马")
                        .field("name", "宝马320")
                        .field("price", 320000)
                        .field("produce_date", "2017-01-01")
                        .endObject());

        UpdateRequest updateRequest = new UpdateRequest("car_shop", "cars", "1")
                .doc(XContentFactory.jsonBuilder()
                        .startObject()
                        .field("price", 310000)
                        .endObject())
                .upsert(indexRequest);
        transportClient.update(updateRequest).get();

mget

MultiGetResponse multiGetItemResponses = transportClient.prepareMultiGet()
                .add("car_shop", "cars", "1")
                .add("car_shop", "cars", "2")
                .get();

        for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
            GetResponse response = itemResponse.getResponse();
            if (response.isExists()) {
                String json = response.getSourceAsString();
                System.out.println(json);
            }
        }

bulk批量操作

BulkRequestBuilder bulkRequest = transportClient.prepareBulk();
        //添加
        bulkRequest.add(transportClient.prepareIndex("car_shop", "sales", "3")
                .setSource(XContentFactory.jsonBuilder()
                        .startObject()
                        .field("brand", "奔驰")
                        .field("name", "奔驰C200")
                        .field("price", 350000)
                        .field("produce_date", "2017-01-05")
                        .field("sale_price", 340000)
                        .field("sale_date", "2017-02-03")
                        .endObject()
                )
        );
        //修复
        bulkRequest.add(transportClient.prepareUpdate("car_shop", "sales", "1")
                .setDoc(XContentFactory.jsonBuilder()
                        .startObject()
                        .field("sale_price", "290000")
                        .endObject()
                )
        );
        //删除
        bulkRequest.add(transportClient.prepareDelete("car_shop", "sales", "2"));
        BulkResponse bulkResponse = bulkRequest.get();

scroll

SearchResponse scrollResp = transportClient.prepareSearch("car_shop").setTypes("sales")
                .setScroll(new TimeValue(60000))
                .setQuery(QueryBuilders.termQuery("brand.keyword", "宝马"))
                .setSize(1)
                .get();
        int batchCount=0;
        do {
            for (SearchHit searchHit : scrollResp.getHits().getHits()) {
                //每次查询一批数据
                System.out.println("batch:"+ ++batchCount);
                System.out.println(searchHit.getSourceAsString());
            }
            scrollResp = transportClient.prepareSearchScroll(scrollResp.getScrollId())
                    .setScroll(new TimeValue(60000))
                    .execute()
                    .actionGet();
        } while (scrollResp.getHits().getHits().length != 0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值