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);