@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("\n\n月份:" + dateBucket.getKeyAsString() + "\n计数:" + 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("\t标签名称:" + tagBucket.getKey() + "\n\t数量:" + tagBucket.getDocCount()); Aggregation avg_price = tagBucket.getAggregations().get("avg_price"); Avg avg = (Avg) avg_price; System.out.println("\t平均价格:" + avg.getValue() + "\n"); } } 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 }
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(); }