ElasticsearchRestTemplate 基本使用

随着数据量的增加和数据结构的复杂化,传统的关系型数据库已经不能满足用户的需求,而搜索引擎则成为了一种更加高效、可扩展的数据检索方案。而 Elasticsearch 则是一个流行的搜索引擎,在 Java 生态系统中,ElasticsearchRestTemplate 是一个使用起来非常方便的 Elasticsearch 客户端,本文将介绍 ElasticsearchRestTemplate 如何实现排序、模糊查询、条件查询、区间查询、距离排序、多条件查询等功能。

  1. 环境搭建

首先我们需要在 pom.xml 中添加 ElasticsearchRestTemplate 的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

然后在 application.properties 中配置 Elasticsearch 集群的地址:

spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

接着,我们需要定义一个 ElasticsearchRepository 来操作 Elasticsearch 中的数据,以 User 为例:

@Repository
public interface UserRepository extends ElasticsearchRepository<User, String> {
}

我们可以定义一些对 User 的属性进行操作的方法,比如模糊查询、条件查询、区间查询等。

  1. 排序

排序是一种非常常见的需求,比如我们要按照 User 的年龄升序排列,可以这样写:

SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withSort(SortBuilders.fieldSort("age").order(SortOrder.ASC))
        .build();
List<User> users = elasticsearchTemplate.queryForList(searchQuery, User.class);

这里用了 SortBuilders 工具类来构建排序规则,然后将其设置在 SearchQuery 中进行查询。

  1. 模糊查询

模糊查询是一种模糊匹配的方式,比如我们要查询名字中含有 “Tom” 的 User,可以这样写:

SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.fuzzyQuery("name", "Tom"))
        .build();
List<User> users = elasticsearchTemplate.queryForList(searchQuery, User.class);

这里用了 QueryBuilders 工具类来构建查询规则,然后将其设置在 SearchQuery 中进行查询。fuzzyQuery() 方法接收两个参数,第一个参数是要查询的字段,第二个参数是要匹配的值。

  1. 条件查询

条件查询是一种根据特定条件查询数据的方式,比如我们要查询所有年龄大于 20 岁的 User,可以这样写:

SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.rangeQuery("age").gt(20))
        .build();
List<User> users = elasticsearchTemplate.queryForList(searchQuery, User.class);

这里用了 QueryBuilders 工具类来构建查询规则,然后将其设置在 SearchQuery 中进行查询。rangeQuery() 方法接收一个参数,即要查询的字段,然后使用 gt() 来指定大于的值。

  1. 区间查询

区间查询是一种根据特定范围查询数据的方式,比如我们要查询年龄在 20 到 30 岁之间的 User,可以这样写:

SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.rangeQuery("age").from(20).to(30))
        .build();
List<User> users = elasticsearchTemplate.queryForList(searchQuery, User.class);

这里用了 QueryBuilders 工具类来构建查询规则,然后将其设置在 SearchQuery 中进行查询。rangeQuery() 方法接收一个参数,即要查询的字段,然后使用 from() 和 to() 来指定查询范围。

  1. 距离排序

距离排序是一种根据地理位置排序的方式,比如我们要查询离某个坐标最近的 User,可以这样写:

GeoPoint location = new GeoPoint(40.12, -71.34);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withSort(SortBuilders.geoDistanceSort("location", location)
                .unit(DistanceUnit.KILOMETERS)
                .order(SortOrder.ASC))
        .build();
List<User> users = elasticsearchTemplate.queryForList(searchQuery, User.class);

这里用了 SortBuilders 工具类来构建排序规则,然后将其设置在 SearchQuery 中进行查询。geoDistanceSort() 方法接收两个参数,第一个参数是要排序的字段,第二个参数是要排序的坐标点。

  1. 多条件查询

多条件查询是一种综合查询的方式,比如我们要查询名字中含有 “Tom” 而且年龄大于 20 岁的 User,可以这样写:

SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(QueryBuilders.boolQuery()
                .must(QueryBuilders.fuzzyQuery("name", "Tom"))
                .must(QueryBuilders.rangeQuery("age").gt(20)))
        .build();
List<User> users = elasticsearchTemplate.queryForList(searchQuery, User.class);

这里用了 QueryBuilders 工具类来构建查询规则,然后将其设置在 SearchQuery 中进行查询。boolQuery() 方法表示使用布尔逻辑查询,must() 方法表示同时满足两个条件。

总结

本文介绍了 ElasticsearchRestTemplate 如何实现排序、模糊查询、条件查询、区间查询、距离排序、多条件查询等功能。使用 ElasticsearchRestTemplate 可以非常方便地进行 Elasticsearch 操作,让我们的搜索功能更加高效、可扩展。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ElasticsearchRestTemplate是Spring Data Elasticsearch提供的一个模块,用于简化与Elasticsearch进行交互的操作。它提供了一组简单而强大的API,用于执行索引、检索、更新和删除等操作。下面是ElasticsearchRestTemplate的详细使用说明: 1. 配置Elasticsearch连接: 在Spring Boot项目中,可以在application.properties或application.yml文件中配置Elasticsearch连接信息。例如: ```yamlspring.data.elasticsearch.cluster-nodes=localhost:9200``` 2. 创建ElasticsearchRestTemplate: 在Java代码中,可以通过注入ElasticsearchRestTemplate使用它。例如: ```java@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate; ``` 3. 执行索引操作: 可以使用ElasticsearchRestTemplate的`index()`方法将对象索引到Elasticsearch中。例如: ```javaIndexQuery indexQuery = new IndexQueryBuilder() .withId("1") .withObject(yourObject) .build(); elasticsearchRestTemplate.index(indexQuery, IndexCoordinates.of("your-index-name")); ``` 4. 执行检索操作: 可以使用ElasticsearchRestTemplate的`search()`方法执行检索操作。例如: ```javaSearchHits<YourObject> searchHits = elasticsearchRestTemplate.search( new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("field", "value")) .build(), YourObject.class, IndexCoordinates.of("your-index-name") ); List<YourObject> yourObjects = searchHits.stream() .map(SearchHit::getContent) .collect(Collectors.toList()); ``` 5. 执行更新操作: 可以使用ElasticsearchRestTemplate的`update()`方法对文档进行更新。例如: ```javaUpdateQuery updateQuery = new UpdateQueryBuilder() .withId("1") .withUpdate(update) .build(); elasticsearchRestTemplate.update(updateQuery, IndexCoordinates.of("your-index-name")); ``` 6. 执行删除操作: 可以使用ElasticsearchRestTemplate的`delete()`方法删除指定的文档。例如: ```javaelasticsearchRestTemplate.delete("1", IndexCoordinates.of("your-index-name")); ``` 以上是ElasticsearchRestTemplate的详细使用说明,你可以根据实际需求使用不同的方法来操作Elasticsearch。希望对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值