最近想的比较多, 小说项目大部分功能都已经完成了。但是还是有很多的细节要完善:
- ES搜索如何集成进去
- Kafka消费者功能要完善
- 统计PV,UV,访问者分布图,操作日志等
- .....
想想还是头大的 !·_·!
进入主题
今天是要介绍通过Java API来如何操作ES。 首先介绍环境,公司电脑上安装的ES版本是5.5.2
引入pom
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.5.2</version>
</dependency>
这里version需要和自己电脑上安装的ES版本一致,不然会出现兼容性问题
基本配置
既然需要操作ES, 当然需要先链接上ES啊
@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就可以了
实际操作
- 通过ID获取数据
// 这里的ID是ES生成的ID
GetResponse fields = client.prepareGet("books", "books", "1").get();
//getSource() 会获取到数据
System.out.println(fields.getSource());
在实际操作中, 如果我们在新安装的ES中进行这样的操作, 会出现 索引不存在 的问题
[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个副片 类型为空
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
方法, 可以看到内部有很多方法,大家可以不用局限于这一种。
- 批量保存数据
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完成, 算是一个抛砖引玉的过程, 期待大家更多的操作。