最近想的比较多, 小说项目大部分功能都已经完成了。可是仍是有不少的细节要完善:node
想一想仍是头大的 !·_·!json
今天是要介绍经过Java API来如何操做ES。 首先介绍环境,公司电脑上安装的ES版本是5.5.2bash
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.5.2</version>
</dependency>
复制代码
这里version须要和本身电脑上安装的ES版本一致,否则会出现兼容性问题app
既然须要操做ES, 固然须要先连接上ES啊elasticsearch
@Configuration
public class ESConfig {
@Bean
public TransportClient client() throws UnknownHostException {
//节点信息, 能够添加多个
InetSocketTransportAddress node = new InetSocketTransportAddress(InetAddress.getByName("192.168.87.134"), 9300);
TransportClient client = new PreBuiltTransportClient(getSetting());
client.addTransportAddress(node);
return client;
}
private Settings getSetting() {
return Settings.builder()
.put("cluster.name", "es_books")
.build();
}
}
复制代码
@Configuration意思是告诉Spring 这个类是一个配置类, 你们就把这个类理解成xml就能够了ui
// 这里的ID是ES生成的ID
GetResponse fields = client.prepareGet("books", "books", "1").get();
//getSource() 会获取到数据
System.out.println(fields.getSource());
复制代码
在实际操做中, 若是咱们在新安装的ES中进行这样的操做, 会出现 索引不存在 的问题this
[books] IndexNotFoundException[no such index]
复制代码
IndicesExistsRequest existsRequest = new IndicesExistsRequest("books");
IndicesExistsResponse response = client.admin().indices().exists(existsRequest).actionGet();
//存在 true, 不存在 false
System.out.println(response.isExists());
复制代码
建立名称为
booksadds
, 类型为booksadd
5个分片1个副片 类型为空spa
String type = "{" +
"\"booksadd\": {" +
"}" +
"}";
client.admin().indices().prepareCreate("booksadds")
.setSettings(Settings.builder().put("index.number_of_shards", 5).put("index.number_of_replicas", 1))
.addMapping("booksadd", type, XContentType.JSON).get();
复制代码
特殊说明: 若是须要设置类型, 参考红线部分日志
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
.startObject()
.field("id", 1)
.field("booksName", "九星霸体诀")
.field("author", "123")
.endObject();
IndexResponse response = client.prepareIndex("booksadds", "booksadd", "1")
.setSource(contentBuilder)
.get();
System.out.println(response);
复制代码
经过查看
setSource
方法, 能够看到内部有不少方法,你们能够不用局限于这一种。code
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
.startObject()
.field("id", 2)
.field("booksName", "九星霸体诀")
.field("author", "123")
.endObject();
IndexRequestBuilder requestBuilder = client.prepareIndex("booksadds", "booksadd", "2")
.setSource(contentBuilder);
//批量加入
BulkRequestBuilder prepareBulk = client.prepareBulk();
prepareBulk.add(requestBuilder);
prepareBulk.execute().get();
复制代码
UpdateRequest request = new UpdateRequest("booksadds", "booksadd", "2");
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
.startObject()
.field("booksName", "九星霸体诀11111")
.endObject();
request.doc(contentBuilder);
UpdateResponse response = client.update(request).get();
System.out.println(response);
复制代码
一样
request.doc()
方法也并不局限于这一种方式
DeleteResponse requestBuilder = this.client.prepareDelete("booksadds", "booksadd", "2").get();
System.out.println(requestBuilder.getResult());
复制代码
client.admin().indices().prepareDelete("booksadds").execute().get();
复制代码
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//匹配booksName查询
boolQueryBuilder.must(QueryBuilders.matchQuery("booksName", "九星"));
SearchResponse searchResponse = client.prepareSearch("books", "books")
.setQuery(boolQueryBuilder)
.addSort("id", SortOrder.DESC) //排序
.setFrom(0) //分页
.setSize(10)
.execute()
.actionGet();
System.out.println(searchResponse.getHits());
复制代码
到这里 经过API操做ES完成, 算是一个抛砖引玉的过程, 期待你们更多的操做。