当前位置:   article > 正文

Java/Kotlin Spring Elasticsearch增删改查教程_kotlin elasticsearch

kotlin elasticsearch

Elasticsearch基本概念

Elasticsearch有四种构成存储空间的基本结构:Indices、Types、Documents、Fields。
将这四种结构和关系型数据库对比,能更好说明它们是什么:

  • Indices看作Database(数据库);
  • Types看作Tables(表);
  • Documents看作Rows(行);
  • Fields看作Columns(列)。

选择操作ES的客户端

官方提供很多操作ES的客户端,比如:

  • Transport Client
  • High Level REST Client
  • 更多客户端详细信息可以去Spring Data Elasticsearch查看。如果你没那么多时间,本文可以让你快速学会,在Spring中对ES增删改查和条件分页查询的简单操作。

本文使用High Level REST Client对ES增删改查。因为这是官方强烈推荐的。

Gradle引入High Level REST Client依赖

Gradle中引入依赖:

implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.4.2'
  • 1

Java 实例

依赖注入Bean

@Autowired
private RestHighLevelClient restHighLevelClient;
  • 1
  • 2

插入

IndexRequest request = new IndexRequest("order")
		.id(data.roundId)
		.source(gson.toJson(data), XContentType.JSON);

restHighLevelClient.index(request, RequestOptions.DEFAULT);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 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);
  • 1
  • 2

更新

UpdateRequest updateRequest = new UpdateRequest("order", data.roundId)
		.doc(gson.toJson(data), XContentType.JSON);
		
restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
  • 1
  • 2
  • 3
  • 4

查询(条件分页)

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) ));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • must()表示查询条件,还有should()mustNot()等,must里的lambda表达式表示有值的时候才查询,更方便根据前端传入的参数进行条件查询。
  • limit为前端传入参数,表示查多少个。 offset为前端传入参数,表示从哪里开始查。

Kotlin 实例

依赖注入Bean

@Autowired
lateinit var restHighLevelClient: RestHighLevelClient
  • 1
  • 2

插入

val request = IndexRequest("order")
		.id(data.roundId)
        .source(gson.toJson(data), XContentType.JSON)
        
restHighLevelClient.index(request, RequestOptions.DEFAULT)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 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)
  • 1
  • 2

更新

val updateRequest = UpdateRequest("order", data.orderId)
		.doc(gson.toJson(data), XContentType.JSON)
                
restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT)
  • 1
  • 2
  • 3
  • 4

查询(条件分页)

inline fun <T> T.applyIf(validate: Boolean, block: T.() -> Unit): T {
    if (validate) {
        block()
    }
    return this
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
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) }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 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)
  • 1
  • 2
  • 3

这样会对ES性能影响,所以并不推荐使用ES做业务,来尽量规避这类问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/68057
推荐阅读
相关标签
  

闽ICP备14008679号