赞
踩
Elasticsearch有四种构成存储空间的基本结构:Indices、Types、Documents、Fields。
将这四种结构和关系型数据库对比,能更好说明它们是什么:
官方提供很多操作ES的客户端,比如:
本文使用High Level REST Client对ES增删改查。因为这是官方强烈推荐的。
Gradle中引入依赖:
implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.4.2'
@Autowired
private RestHighLevelClient restHighLevelClient;
IndexRequest request = new IndexRequest("order")
.id(data.roundId)
.source(gson.toJson(data), XContentType.JSON);
restHighLevelClient.index(request, RequestOptions.DEFAULT);
IndexRequest("order")
,表示index名;id(data.roundId)
,表示document名字;source(gson.toJson(data), XContentType.JSON)
,表示存入data对象转json的字符串。DeleteRequest deleteRequest = new DeleteRequest("order", data.roundId);
restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
UpdateRequest updateRequest = new UpdateRequest("order", data.roundId)
.doc(gson.toJson(data), XContentType.JSON);
restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
SearchRequest request = new SearchRequest("order"); request.source( new SearchSourceBuilder() .query((QueryBuilder) QueryBuilders.boolQuery() .must(()->{ if(path != null){ QueryBuilders.termQuery(String.valueOf(Player.class.getField("name")), ip); } } ) .must( // 如有多个条件,添加参照上个 must ) ) .sort(JsonUtils.class.getField("inTime"), SortOrder.DESC) .size(limit) .from(offset) ); SearchHits hits = restHighLevelClient.search(request, RequestOptions.DEFAULT).getHits(); long total = hits.getTotalHits().value; List<Player> result = null; Stream.of(hits.getHits()).forEach(y -> result.add( gson.fromJson(y.getSourceAsString(), Player.class) ));
must()
表示查询条件,还有should()
、mustNot()
等,must
里的lambda表达式表示有值的时候才查询,更方便根据前端传入的参数进行条件查询。limit
为前端传入参数,表示查多少个。 offset
为前端传入参数,表示从哪里开始查。@Autowired
lateinit var restHighLevelClient: RestHighLevelClient
val request = IndexRequest("order")
.id(data.roundId)
.source(gson.toJson(data), XContentType.JSON)
restHighLevelClient.index(request, RequestOptions.DEFAULT)
IndexRequest("order")
,表示index名;id(data.roundId)
,表示document名字;source(gson.toJson(data), XContentType.JSON)
,表示存入data对象转json的字符串。val deleteRequest = DeleteRequest("order", roomPlayer.roomId.toString() + "rpl" + roomPlayer.playerId)
restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT)
val updateRequest = UpdateRequest("order", data.orderId)
.doc(gson.toJson(data), XContentType.JSON)
restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT)
inline fun <T> T.applyIf(validate: Boolean, block: T.() -> Unit): T {
if (validate) {
block()
}
return this
}
val request = SearchRequest("order") request.source( SearchSourceBuilder() .query(QueryBuilders.boolQuery() .applyIf(startTime != null && endTime != null) { must( QueryBuilders.rangeQuery(MainVisitRecordPO::inTime.name) .gte(startTime!! * 1000) .lte(endTime!! * 1000) ) } .applyIf(ip != null) { must( QueryBuilders.termQuery(MainVisitRecordPO::ip.name, ip) ) } ) .sort(MainVisitRecordPO::inTime.name, SortOrder.DESC) .size(pageable.limit) .from(pageable.offset) ) val hits = restHighLevelClient.search(request, RequestOptions.DEFAULT).hits val total = hits.totalHits?.value?:0 val result = hits.hits.map { gson.fromJson(it.sourceAsString, MainVisitRecordPO::class.java) }
must()
表示查询条件,还有should()
、mustNot()
等,must
里的lambda表达式表示有值的时候才查询,更方便根据前端传入的参数进行条件查询。limit
为前端传入参数,表示查多少个。 offset
为前端传入参数,表示从哪里开始查。对Elasticsearch增、删、改的操作,并不是实时的。也就是更改A
数据后立刻查询A
数据,得到的结果依旧是未更新的A
数据。
需要立刻更新ES需要使用setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
设置,比如更新操作:
val updateRequest = UpdateRequest("order", data.orderId)
.doc(gson.toJson(data), XContentType.JSON)
.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
这样会对ES性能影响,所以并不推荐使用ES做业务,来尽量规避这类问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。