依赖:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.1</version> <relativePath/> <!-- lookup parent from repository --> </parent>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
在java代码中使用的几种方法
1.使用JPA的方法使用ElasticSearch
1.首先创建对应的实体类
@Document(indexName = "user") @Data @AllArgsConstructor @NoArgsConstructor public class User { private String id; private String username; private String department; private String sex; private Integer age; private String firstName; private String lastName; }
2.创建实现的Repository去继承ElasticsearchRepository
public interface EsRepository extends ElasticsearchRepository<User,String > { List<User> findAllByUsernameLike(String username); }
里面可以按照JPA的命名规范去命名并实现查找,如Like就是模糊查询,下面是一些
关键字的说明
And | findByNameAndPrice | {“bool” : {“must” : [ {“field” : {“name” : “?”}}, {“field” : {“price” : “?”}} ]}} |
Is | findByName | {“bool” : {“must” : {“field” : {“name” : “?”}}}} |
Or | findByNameOrPrice | {“bool” : {“should” : [ {“field” : {“name” : “?”}}, {“field” : {“price” : “?”}} ]}} |
Not | findByNameNot | {“bool” : {“must_not” : {“field” : {“name” : “?”}}}} |
Between | findByPriceBetween | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,“to” : ?,“include_lower” : true,“include_upper” : true}}}}} |
LessThanEqual | findByPriceLessThan | {“bool” : {“must” : {“range” : {“price” : {“from” : null,“to” : ?,“include_lower” : true,“include_upper” : true}}}}} |
GreaterThanEqual | findByPriceGreaterThan | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,“to” : null, “include_lower” : true,“include_upper” : true}}}}} |
After | findByPriceAfter | {“bool” : {“must” : {“range” : {“price” : {“from” : ?,“to” : null,“include_lower” : true,“include_upper” : true}}}}} |
Like | findByNameLike |
|
如何使用
public EsResponse findUserInfoFuzzyByRepository(String username) { List<User> userInfo = esRepository.findAllByUsernameLike(username); List<EsResponse.userInfo> userInfos = EsConvey.INSTANCE.toUserList(userInfo); return EsResponse.builder().userInfoList(userInfos).build(); }
2.使用ElasticsearchRestTemplate的方法使用ElasticSearch
2.1首先
@Autowired ElasticsearchRestTemplate elasticsearchRestTemplate;
2.2代码实现
@Override public EsResponse findUserInfoFuzzyByEsTemplate(String username) { BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder().must(new WildcardQueryBuilder("username","*"+username+"*")); NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder() .withQuery(boolQueryBuilder); IndexCoordinates user = IndexCoordinates.of("user"); List<User> userList=new ArrayList<>(); elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), User.class, user) .toList().stream().forEach(e->userList.add(e.getContent())); List<EsResponse.userInfo> userInfos = EsConvey.INSTANCE.toUserList(userList); return EsResponse.builder().userInfoList(userInfos).build(); }
博主发现可能由于版本的不同,elasticsearchRestTemplate实现的方法也会不同。
比如可能有小伙伴会发现为什么博主这里是BoolQueryBuilder,其他博主有用BoolQuery的,也有去用Bool的,这需要小伙伴合理的去运用变化了。
这些只是代码中的简单运用,暂时先分享到这里。谢谢