继续ELK。
今天主要学习了下ElasticSearch的CURD。用到一个head插件,可以可视化es内部的数据。下载地址:https://github.com/mobz/elasticsearch-head
需要注意的是为了能让它和ES进行通信,需要在设置跨域。在ES的config中添加
http.cors.enabled:true
http.cors.allow-origin:"*"
成功启动之后,会出现以下的页面。
![](https://img.haomeiwen.com/i4006834/43c36c941e82a0d4.png)
配置多集群
在config/elasticsearch.yml文件中新增
node.name: master
node.master: true
network.host:127.0.0.1
这样我们就配好了集群的master节点。node 节点安装同master节点一致。区别在于在config中配置需要指定cluster.name和master一致,并且需要设置http.port以及绑定master节点:discovery.zen.ping.unicast.hosts:[127.0.0.1] 。
索引:含有相同属性的文档集合(类似于数据库)
类型:索引可以定义一个或者多个类型,文档必须属于一个类型(类似于表)
文档:文档是可以被索引的基本数据单位(类似于一条记录)
结合springboot来编写CURD
- 首先我们现在es中建立index:people,type为man,三个字段:name,age,date。如下图:
![](https://img.haomeiwen.com/i4006834/0b7c7e2ada77a6c0.png)
- 在pom中引入ES
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.4.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.4.3</version>
</dependency>
- 编写与ES server的config。
@Configuration
class MyEsConfig {
@Bean
public TransportClient client() {
Settings settings = Settings.builder()
.put("client.transport.sniff", true)
.put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(new InetSocketAddress("16.155.196.55", 9300)));
return client;
}
}
- CURD
@Autowired
private TransportClient client;
//read
@GetMapping("/get/people/man")
@ResponseBody
public ResponseEntity get(@RequestParam(name = "id", defaultValue = "") String id) {
if (id.isEmpty()) {
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
GetResponse result = this.client.prepareGet("people", "man", id).get();
if (!result.isExists()) {
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
return new ResponseEntity(result.getSource(), HttpStatus.OK);
}
//add
@PostMapping("/add/people/man")
@ResponseBody
public ResponseEntity add(@RequestParam(name = "name", defaultValue = "") String name,
@RequestParam(name = "age", defaultValue = "") String age,
@RequestParam(name = "date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date date) {
try {
XContentBuilder content = XContentFactory.jsonBuilder()
.startObject()
.field("name", name)
.field("age", age)
.field("date", date.getTime())
.endObject();
IndexResponse result = this.client.prepareIndex("people", "man").setSource(content).get();
return new ResponseEntity(result.getId(), HttpStatus.OK);
} catch (IOException e) {
e.printStackTrace();
return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
//delete
@DeleteMapping("/delete/people/man")
@ResponseBody
public ResponseEntity delete(@RequestParam(name = "id") String id) {
DeleteResponse result = this.client.prepareDelete("people", "man", id).get();
return new ResponseEntity(result.getResult().toString(), HttpStatus.OK);
}
//update
@PutMapping("/update/people/man")
@ResponseBody
public ResponseEntity update(@RequestParam(name = "id") String id,
@RequestParam(name = "name", required = false) String name,
@RequestParam(name = "age", required = false) String age) {
UpdateRequest update = new UpdateRequest("people", "man", id);
try {
XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
if (name != null) {
builder.field("name", name);
}
if (age != null) {
builder.field("age", age);
}
builder.endObject();
update.doc(builder);
UpdateResponse result = this.client.update(update).get();
return new ResponseEntity(result.getResult().toString(), HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// complex query
@PostMapping("/query/people/man")
@ResponseBody
public ResponseEntity query(@RequestParam(name = "name") String name,
@RequestParam(name = "age") String age) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (name != null) {
boolQueryBuilder.must(QueryBuilders.matchQuery("name", name));
}
if (age != null) {
boolQueryBuilder.must(QueryBuilders.matchQuery("age", age));
}
SearchRequestBuilder builder = this.client.prepareSearch("people").setTypes("man")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(boolQueryBuilder).setSize(10);
SearchResponse response = builder.get();
List<Map<String, Object>> result = new ArrayList<>();
for (SearchHit s : response.getHits()) {
result.add(s.getSourceAsMap());
}
return new ResponseEntity(result, HttpStatus.OK);
}
![](https://img.haomeiwen.com/i4006834/f2c03a62a9bd1fff.png)
测试时候我们用postman来进行调试,还是挺方便的。
![](https://img.haomeiwen.com/i4006834/b972beb10bc0e573.png)
网友评论